Compare commits

...
21 Commits
Author SHA1 Message Date
Hugo 1c1c095a66 docs: Update changelog for new version
Lint GitHub Actions workflows / actionlint (push) Successful in 15s
make-gen-delta / Check for uncommitted changes from make gen (push) Failing after 1m9s
Release / go-version (push) Successful in 3s
Release / release-notes (push) Failing after 7s
Release / Terraform Provider Release (push) Skipped
test / test (push) Failing after 52m54s
2024-10-21 17:15:10 +01:00
Hugo f9fd811205 feat(provider): Support worker filter on dynamic host catalogs 2024-10-21 17:15:10 +01:00
hashicorp-tsccr[bot]andhashicorp-tsccr[bot] ad43c0bec0 Result of tsccr-helper -log-level=info gha update -latest . (#625)
Co-authored-by: hashicorp-tsccr[bot] <hashicorp-tsccr[bot]@users.noreply.github.com>
2024-10-09 12:29:58 -04:00
Hugo 5d6d277186 chore(provider): Remove support for GrantScopeId (#627) 2024-10-08 18:37:12 +01:00
Michael Li 4590e7f8c8 chore: Update use of deprecated utility (#624) 2024-09-23 14:26:01 -04:00
hashicorp-tsccr[bot]andhashicorp-tsccr[bot] 47c3f92f5c Result of tsccr-helper -log-level=info gha update -latest . (#622)
Co-authored-by: hashicorp-tsccr[bot] <hashicorp-tsccr[bot]@users.noreply.github.com>
2024-09-03 10:28:25 -04:00
hashicorp-tsccr[bot]andhashicorp-tsccr[bot] 490476a5e5 Result of tsccr-helper -log-level=info gha update -latest . (#620)
Co-authored-by: hashicorp-tsccr[bot] <hashicorp-tsccr[bot]@users.noreply.github.com>
2024-08-01 09:38:25 -04:00
Bruno Schaatsbergen a256b763ae docs: separate worker and controller led resources (#619)
* docs: separate worker and controller led resources

* docs: change title for consistency

* docs: make docs

* chore: use unique names for workers and add an 'Example Usage' section
2024-07-22 09:24:22 -04:00
Bruno Schaatsbergen f6539b969c chore: replace deprecated arguments in provider example (#617)
* chore: replace deprecated arguments in provider example

* chore: fix extra newline

* Revert "chore: fix extra newline"

This reverts commit cf2de60acfcf6c9499d0306243041f950a0851f6.

* Revert "chore: replace deprecated arguments in provider example"

This reverts commit 49a336f7684707edb36021eef7d11bb92e4fa1b4.

* chore: change example

* chore: update example in README

* chore: create a tests for the deprecated auth method
2024-07-15 10:02:58 -04:00
hashicorp-tsccr[bot]andhashicorp-tsccr[bot] 695e28a38b Result of tsccr-helper -log-level=info gha update -latest . (#616)
Co-authored-by: hashicorp-tsccr[bot] <hashicorp-tsccr[bot]@users.noreply.github.com>
2024-07-10 09:38:56 -04:00
hashicorp-tsccr[bot]andhashicorp-tsccr[bot] b7b11dd817 Result of tsccr-helper -log-level=info gha update -latest . (#615)
Co-authored-by: hashicorp-tsccr[bot] <hashicorp-tsccr[bot]@users.noreply.github.com>
2024-06-03 09:55:35 -04:00
Michael Li b9bc73d4cf chore: Update to use Node20 version of Actions (#610) 2024-05-08 15:11:15 -04:00
Damian Debkowski e847f5fde7 chore: update changelog for 1.1.15 release
Lint GitHub Actions workflows / actionlint (push) Failing after 16s
make-gen-delta / Check for uncommitted changes from make gen (push) Failing after 1m48s
Release / go-version (push) Successful in 8s
Release / release-notes (push) Failing after 39s
Release / Terraform Provider Release (push) Skipped
test / test (push) Failing after 4m50s
2024-05-01 09:57:27 -07:00
Todd 53c2a5769c Add target alias resource (#571)
* Add target alias resource

* increment the number of authorize_acctions returned on an admin user
2024-05-01 09:37:45 -07:00
hashicorp-tsccr[bot]andhashicorp-tsccr[bot] ed1bf21505 Result of tsccr-helper -log-level=info gha update -latest . (#606)
Co-authored-by: hashicorp-tsccr[bot] <hashicorp-tsccr[bot]@users.noreply.github.com>
2024-05-01 10:19:55 -04:00
hashicorp-tsccr[bot]andhashicorp-tsccr[bot] 6a23fc20f9 Result of tsccr-helper -log-level=info gha update -latest . (#591)
Co-authored-by: hashicorp-tsccr[bot] <hashicorp-tsccr[bot]@users.noreply.github.com>
2024-04-01 09:55:08 -04:00
Louis Ruch 41653b2ccd chore: Update deps 2024-03-03 22:02:25 -08:00
dependabot[bot] 398eaf8406 build(deps): bump github.com/jimlambrt/gldap from 0.1.9 to 0.1.11
Bumps [github.com/jimlambrt/gldap](https://github.com/jimlambrt/gldap) from 0.1.9 to 0.1.11.
- [Release notes](https://github.com/jimlambrt/gldap/releases)
- [Commits](https://github.com/jimlambrt/gldap/compare/v0.1.9...v0.1.11)

---
updated-dependencies:
- dependency-name: github.com/jimlambrt/gldap
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-03 21:30:12 -08:00
dependabot[bot] c71ba43a3d build(deps): bump golang.org/x/crypto from 0.19.0 to 0.20.0
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.19.0 to 0.20.0.
- [Commits](https://github.com/golang/crypto/compare/v0.19.0...v0.20.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-03 21:29:40 -08:00
hashicorp-tsccr[bot]andhashicorp-tsccr[bot] 1153ea44ee Result of tsccr-helper -log-level=info gha update -latest . (#569)
Co-authored-by: hashicorp-tsccr[bot] <hashicorp-tsccr[bot]@users.noreply.github.com>
2024-03-01 09:24:07 -05:00
Danielle Miu 2020819648 add new section to changelog for next 2024-02-14 13:32:21 -05:00
31 changed files with 1326 additions and 738 deletions

No files matched your search

+1 -1
View File
@@ -8,7 +8,7 @@ jobs:
actionlint: actionlint:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Check workflow files - name: Check workflow files
uses: docker://docker.mirror.hashicorp.services/rhysd/actionlint@sha256:02ccb6d91e4cb4a7b21eb99d5274d257e81ae667688d730e89d7ea0d6d35db91 uses: docker://docker.mirror.hashicorp.services/rhysd/actionlint@sha256:02ccb6d91e4cb4a7b21eb99d5274d257e81ae667688d730e89d7ea0d6d35db91
with: with:
+39 -20
View File
@@ -22,7 +22,7 @@ jobs:
id: boundary-team-role id: boundary-team-role
run: | run: |
TEAM="boundary" TEAM="boundary"
ROLE="$(hub api orgs/hashicorp/teams/${TEAM}/memberships/${{ github.actor }} | jq -r '.role | select(.!=null)')" ROLE="$(gh api orgs/hashicorp/teams/${TEAM}/memberships/${{ github.actor }} | jq -r '.role | select(.!=null)')"
if [[ -n "${ROLE}" ]]; then if [[ -n "${ROLE}" ]]; then
echo "Actor ${{ github.actor }} is a ${TEAM} team member, skipping ticket creation" echo "Actor ${{ github.actor }} is a ${TEAM} team member, skipping ticket creation"
else else
@@ -32,13 +32,6 @@ jobs:
env: env:
GITHUB_TOKEN: ${{ secrets.JIRA_SYNC_GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.JIRA_SYNC_GITHUB_TOKEN }}
- name: Login
uses: atlassian/gajira-login@45fd029b9f1d6d8926c6f04175aa80c0e42c9026 # v3.0.1
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
- name: Set ticket type - name: Set ticket type
if: github.event.action == 'opened' && !steps.boundary-team-role.outputs.role if: github.event.action == 'opened' && !steps.boundary-team-role.outputs.role
id: set-ticket-type id: set-ticket-type
@@ -52,6 +45,10 @@ jobs:
- name: Create ticket - name: Create ticket
if: github.event.action == 'opened' && !steps.boundary-team-role.outputs.role if: github.event.action == 'opened' && !steps.boundary-team-role.outputs.role
uses: tomhjp/gh-action-jira-create@3ed1789cad3521292e591a7cfa703215ec1348bf # v0.2.1 uses: tomhjp/gh-action-jira-create@3ed1789cad3521292e591a7cfa703215ec1348bf # v0.2.1
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
with: with:
project: ICU project: ICU
issuetype: "GH Issue" issuetype: "GH Issue"
@@ -64,6 +61,10 @@ jobs:
if: github.event.action != 'opened' if: github.event.action != 'opened'
id: search id: search
uses: tomhjp/gh-action-jira-search@04700b457f317c3e341ce90da5a3ff4ce058f2fa # v0.2.2 uses: tomhjp/gh-action-jira-search@04700b457f317c3e341ce90da5a3ff4ce058f2fa # v0.2.2
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
with: with:
# cf[10089] is Issue Link custom field # cf[10089] is Issue Link custom field
jql: 'issuetype = "GH Issue" and cf[10089]="${{ github.event.issue.html_url || github.event.pull_request.html_url }}"' jql: 'issuetype = "GH Issue" and cf[10089]="${{ github.event.issue.html_url || github.event.pull_request.html_url }}"'
@@ -71,20 +72,38 @@ jobs:
- name: Sync comment - name: Sync comment
if: github.event.action == 'created' && steps.search.outputs.issue if: github.event.action == 'created' && steps.search.outputs.issue
uses: tomhjp/gh-action-jira-comment@6eb6b9ead70221916b6badd118c24535ed220bd9 # v0.2.0 uses: tomhjp/gh-action-jira-comment@6eb6b9ead70221916b6badd118c24535ed220bd9 # v0.2.0
env:
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}
with: with:
issue: ${{ steps.search.outputs.issue }} issue: ${{ steps.search.outputs.issue }}
comment: "${{ github.actor }} ${{ github.event.review.state || 'commented' }}:\n\n${{ github.event.comment.body || github.event.review.body }}\n\n${{ github.event.comment.html_url || github.event.review.html_url }}" comment: "${{ github.actor }} ${{ github.event.review.state || 'commented' }}:\n\n${{ github.event.comment.body || github.event.review.body }}\n\n${{ github.event.comment.html_url || github.event.review.html_url }}"
- name: Close ticket - name: Transitions
if: (github.event.action == 'closed' || github.event.action == 'deleted') && steps.search.outputs.issue id: transitions
uses: atlassian/gajira-transition@38fc9cd61b03d6a53dd35fcccda172fe04b36de3 # v3.0.1 if: steps.search.outputs.issue
with: run: |
issue: ${{ steps.search.outputs.issue }} if [[ "${{ github.event.action }}" == "closed" || "${{ github.event.action }}" == "deleted" ]]; then
transition: Done echo "Closing ticket"
echo "name=Done" >> "$GITHUB_OUTPUT"
elif [[ "${{ github.event.action }}" == "reopened" ]]; then
echo "Reopening ticket"
echo "name='Reopen'" >> "$GITHUB_OUTPUT"
fi
- name: Reopen ticket # Transition issue API reference: https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-issueidorkey-transitions-post
if: github.event.action == 'reopened' && steps.search.outputs.issue - name: Transition ticket
uses: atlassian/gajira-transition@38fc9cd61b03d6a53dd35fcccda172fe04b36de3 # v3.0.1 if: steps.transitions.outputs.name
with: run: |
issue: ${{ steps.search.outputs.issue }} transitions="$(curl --silent \
transition: "To Do" --url "${{ secrets.JIRA_BASE_URL }}rest/api/3/issue/${{ steps.search.outputs.issue }}/transitions" \
--user "${{ secrets.JIRA_USER_EMAIL }}:${{ secrets.JIRA_API_TOKEN }}" \
--header "Accept: application/json")"
id="$(echo "${transitions}" | jq -r '.transitions[] | select(.name == "${{ steps.transitions.outputs.name }}") | .id')"
curl --silent \
--url "${{ secrets.JIRA_BASE_URL }}rest/api/3/issue/${{ steps.search.outputs.issue }}/transitions" \
--user "${{ secrets.JIRA_USER_EMAIL }}:${{ secrets.JIRA_API_TOKEN }}" \
--header "Accept: application/json" \
--header "Content-Type: application/json" \
--data "$(printf '{"transition": {"id": "%s"}}' "${id}")"
+2 -2
View File
@@ -13,7 +13,7 @@ jobs:
name: "Check for uncommitted changes from make gen" name: "Check for uncommitted changes from make gen"
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with: with:
fetch-depth: '0' fetch-depth: '0'
- name: Determine Go version - name: Determine Go version
@@ -24,7 +24,7 @@ jobs:
echo "Building with Go $(cat .go-version)" echo "Building with Go $(cat .go-version)"
echo "go-version=$(cat .go-version)" >> "$GITHUB_OUTPUT" echo "go-version=$(cat .go-version)" >> "$GITHUB_OUTPUT"
- name: Set up Go - name: Set up Go
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
with: with:
go-version: "${{ steps.get-go-version.outputs.go-version }}" go-version: "${{ steps.get-go-version.outputs.go-version }}"
- name: Running go mod tidy - name: Running go mod tidy
+4 -4
View File
@@ -14,7 +14,7 @@ jobs:
outputs: outputs:
version: ${{ steps.go-version.outputs.go-version }} version: ${{ steps.go-version.outputs.go-version }}
steps: steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- id: go-version - id: go-version
# We use .go-version as our source of truth for current Go # We use .go-version as our source of truth for current Go
# version, because "goenv" can react to it automatically. # version, because "goenv" can react to it automatically.
@@ -24,12 +24,12 @@ jobs:
release-notes: release-notes:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Generate Release Notes - name: Generate Release Notes
run: sed -n -e "1{/# /d;}" -e "2{/^$/d;}" -e "/# $(git describe --abbrev=0 --exclude="$(git describe --abbrev=0 --match='v*.*.*' --tags)" --match='v*.*.*' --tags | tr -d v)/q;p" CHANGELOG.md > release-notes.txt run: sed -n -e "1{/# /d;}" -e "2{/^$/d;}" -e "/# $(git describe --abbrev=0 --exclude="$(git describe --abbrev=0 --match='v*.*.*' --tags)" --match='v*.*.*' --tags | tr -d v)/q;p" CHANGELOG.md > release-notes.txt
- uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 # v4.3.0 - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
with: with:
name: release-notes name: release-notes
path: release-notes.txt path: release-notes.txt
@@ -37,7 +37,7 @@ jobs:
terraform-provider-release: terraform-provider-release:
name: 'Terraform Provider Release' name: 'Terraform Provider Release'
needs: [go-version, release-notes] needs: [go-version, release-notes]
uses: hashicorp/ghaction-terraform-provider-release/.github/workflows/hashicorp.yml@v3 uses: hashicorp/ghaction-terraform-provider-release/.github/workflows/hashicorp.yml@v4
secrets: secrets:
hc-releases-github-token: '${{ secrets.HASHI_RELEASES_GITHUB_TOKEN }}' hc-releases-github-token: '${{ secrets.HASHI_RELEASES_GITHUB_TOKEN }}'
hc-releases-host-staging: '${{ secrets.HC_RELEASES_HOST_STAGING }}' hc-releases-host-staging: '${{ secrets.HC_RELEASES_HOST_STAGING }}'
+3 -3
View File
@@ -13,7 +13,7 @@ jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Determine go version - name: Determine go version
id: get-go-version id: get-go-version
# We use .go-version as our source of truth for current Go # We use .go-version as our source of truth for current Go
@@ -22,7 +22,7 @@ jobs:
echo "Building with Go $(cat .go-version)" echo "Building with Go $(cat .go-version)"
echo "go-version=$(cat .go-version)" >> "$GITHUB_OUTPUT" echo "go-version=$(cat .go-version)" >> "$GITHUB_OUTPUT"
- name: Set up Go - name: Set up Go
uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0 uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2
with: with:
go-version: "${{ steps.get-go-version.outputs.go-version }}" go-version: "${{ steps.get-go-version.outputs.go-version }}"
cache: false cache: false
@@ -32,7 +32,7 @@ jobs:
echo "go-build=$(go env GOCACHE)" >> "$GITHUB_OUTPUT" echo "go-build=$(go env GOCACHE)" >> "$GITHUB_OUTPUT"
echo "go-mod=$(go env GOMODCACHE)" >> "$GITHUB_OUTPUT" echo "go-mod=$(go env GOMODCACHE)" >> "$GITHUB_OUTPUT"
- name: Set up Go modules cache - name: Set up Go modules cache
uses: actions/cache@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0 uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2
with: with:
path: | path: |
${{ steps.go-cache-paths.outputs.go-build }} ${{ steps.go-cache-paths.outputs.go-build }}
+23 -1
View File
@@ -2,6 +2,28 @@
Canonical reference for changes, improvements, and bugfixes for the Boundary Terraform provider. Canonical reference for changes, improvements, and bugfixes for the Boundary Terraform provider.
## 1.2.0 (October 21, 2024)
### New and Improved
* Introduces support for specifying a worker filter in dynamic host catalogs
([PR](https://github.com/hashicorp/terraform-provider-boundary/pull/626))
### Deprecations/Changes
* With Boundary 0.15, a deprecation notice was put under the `grant_scope_id`
field, and a new `grant_scope_ids` field was introduced to replace it. With
Boundary v0.17.1 and Boundary API v0.0.52, `grant_scope_id` support was
entirely removed. `grant_scope_id` support has now been removed from this TF
provider.
## 1.1.15 (May 1, 2024)
### New and Improved
* Add support for a target alias as a resource
([PR](https://github.com/hashicorp/terraform-provider-boundary/pull/571))
## 1.1.14 (February 14, 2024) ## 1.1.14 (February 14, 2024)
### New and Improved ### New and Improved
@@ -328,4 +350,4 @@ Update provider to handle new domain errors ([PR](https://github.com/hashicorp/t
## 0.1.0 (October 14, 2020) ## 0.1.0 (October 14, 2020)
Initial release! Initial release!
+4 -4
View File
@@ -97,10 +97,10 @@ Please see our detailed docs for individual resource usage. Below is a complex e
```hcl ```hcl
provider "boundary" { provider "boundary" {
addr = "http://127.0.0.1:9200" addr = "http://127.0.0.1:9200"
auth_method_id = "ampw_1234567890" # changeme auth_method_id = "ampw_1234567890" # changeme
password_auth_method_login_name = "myuser" # changeme auth_method_login_name = "myuser" # changeme
password_auth_method_password = "passpass" # changeme auth_method_password = "passpass" # changeme
} }
variable "users" { variable "users" {
+11 -11
View File
@@ -15,23 +15,23 @@ Do not keep your authentication password in HCL for production environments, use
```terraform ```terraform
provider "boundary" { provider "boundary" {
addr = "http://127.0.0.1:9200" addr = "http://127.0.0.1:9200"
auth_method_id = "ampw_1234567890" # changeme auth_method_id = "ampw_1234567890" # changeme
password_auth_method_login_name = "myuser" # changeme auth_method_login_name = "myuser" # changeme
password_auth_method_password = "passpass" # changeme auth_method_password = "passpass" # changeme
} }
provider "boundary" { provider "boundary" {
addr = "http://127.0.0.1:9200" addr = "http://127.0.0.1:9200"
password_auth_method_login_name = "myuser" auth_method_login_name = "myuser"
password_auth_method_password = "passpass" auth_method_password = "passpass"
} }
provider "boundary" { provider "boundary" {
addr = "http://127.0.0.1:9200" addr = "http://127.0.0.1:9200"
password_auth_method_login_name = "myuser" auth_method_login_name = "myuser"
password_auth_method_password = "passpass" auth_method_password = "passpass"
scope_id = "s_1234567890" scope_id = "s_1234567890"
} }
``` ```
+106
View File
@@ -0,0 +1,106 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "boundary_alias_target Resource - terraform-provider-boundary"
subcategory: ""
description: |-
The target alias resource allows you to configure a Boundary target alias.
---
# boundary_alias_target (Resource)
The target alias resource allows you to configure a Boundary target alias.
## Example Usage
```terraform
resource "boundary_scope" "org" {
name = "organization_one"
description = "global scope"
scope_id = "global"
auto_create_admin_role = true
auto_create_default_role = true
}
resource "boundary_scope" "project" {
name = "project_one"
description = "My first scope!"
scope_id = boundary_scope.org.id
auto_create_admin_role = true
}
resource "boundary_host_catalog_static" "foo" {
name = "test"
description = "test catalog"
scope_id = boundary_scope.project.id
}
resource "boundary_host_static" "foo" {
name = "foo"
host_catalog_id = boundary_host_catalog_static.foo.id
address = "10.0.0.1"
}
resource "boundary_host_static" "bar" {
name = "bar"
host_catalog_id = boundary_host_catalog_static.foo.id
address = "127.0.0.1"
}
resource "boundary_host_set_static" "foo" {
name = "foo"
host_catalog_id = boundary_host_catalog_static.foo.id
host_ids = [
boundary_host_static.foo.id,
boundary_host_static.bar.id,
]
}
resource "boundary_target" "foo" {
name = "foo"
description = "Foo target"
type = "tcp"
default_port = "22"
scope_id = boundary_scope.project.id
host_source_ids = [
boundary_host_set_static.foo.id,
]
}
resource "boundary_alias_target" "example_alias_target" {
name = "example_alias_target"
description = "Example alias to target foo using host boundary_host_static.bar"
scope_id = "global"
value = "example.bar.foo.boundary"
destination_id = boundary_target.foo.id
authorize_session_host_id = boundary_host_static.bar.id
}
```
<!-- schema generated by tfplugindocs -->
## Schema
### Required
- `scope_id` (String) The scope ID.
- `value` (String) The value of the alias.
### Optional
- `authorize_session_host_id` (String) The host id to pass to Boundary when performing an authorize session action.
- `description` (String) The alias description.
- `destination_id` (String) The destination of the alias.
- `name` (String) The alias name. Defaults to the resource name.
- `type` (String) The type of alias; hardcoded.
### Read-Only
- `id` (String) The ID of the account.
## Import
Import is supported using the following syntax:
```shell
terraform import boundary_alias_target.example_alias_target <my-id>
```
+1
View File
@@ -94,6 +94,7 @@ resource "boundary_host_catalog_plugin" "azure_example" {
- `plugin_name` (String) The name of the plugin that should back the resource. This or plugin_id must be defined. - `plugin_name` (String) The name of the plugin that should back the resource. This or plugin_id must be defined.
- `secrets_hmac` (String) The HMAC'd secrets value returned from the server. - `secrets_hmac` (String) The HMAC'd secrets value returned from the server.
- `secrets_json` (String, Sensitive) The secrets for the host catalog. Either values encoded with the "jsonencode" function, pre-escaped JSON string, or a file:// or env:// path. Set to a string "null" to clear any existing values. NOTE: Unlike "attributes_json", removing this block will NOT clear secrets from the host catalog; this allows injecting secrets for one call, then removing them for storage. - `secrets_json` (String, Sensitive) The secrets for the host catalog. Either values encoded with the "jsonencode" function, pre-escaped JSON string, or a file:// or env:// path. Set to a string "null" to clear any existing values. NOTE: Unlike "attributes_json", removing this block will NOT clear secrets from the host catalog; this allows injecting secrets for one call, then removing them for storage.
- `worker_filter` (String) HCP Only. A filter used to control which PKI workers can handle dynamic host catalog requests.
### Read-Only ### Read-Only
-1
View File
@@ -127,7 +127,6 @@ resource "boundary_role" "readonly" {
### Optional ### Optional
- `description` (String) The role description. - `description` (String) The role description.
- `grant_scope_id` (String, Deprecated) For Boundary 0.15+, use `grant_scope_ids` instead. The scope for which the grants in the role should apply.
- `grant_scope_ids` (Set of String) A list of scopes for which the grants in this role should apply, which can include the special values "this", "children", or "descendants" - `grant_scope_ids` (Set of String) A list of scopes for which the grants in this role should apply, which can include the special values "this", "children", or "descendants"
- `grant_strings` (Set of String) A list of stringified grants for the role. - `grant_strings` (Set of String) A list of stringified grants for the role.
- `name` (String) The role name. Defaults to the resource name. - `name` (String) The role name. Defaults to the resource name.
+8 -3
View File
@@ -1,5 +1,4 @@
--- ---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "boundary_worker Resource - terraform-provider-boundary" page_title: "boundary_worker Resource - terraform-provider-boundary"
subcategory: "" subcategory: ""
description: |- description: |-
@@ -12,16 +11,22 @@ The resource allows you to create a self-managed worker object.
## Example Usage ## Example Usage
### Controller-led worker
```terraform ```terraform
resource "boundary_worker" "controller_led" { resource "boundary_worker" "controller_led" {
scope_id = "global" scope_id = "global"
name = "worker 1" name = "controller-led-worker-1"
description = "self managed worker with controller led auth" description = "self managed worker with controller led auth"
} }
```
### Worker-led worker
```terraform
resource "boundary_worker" "worker_led" { resource "boundary_worker" "worker_led" {
scope_id = "global" scope_id = "global"
name = "worker 2" name = "worker-led-worker-1"
description = "self managed worker with worker led auth" description = "self managed worker with worker led auth"
worker_generated_auth_token = var.worker_generated_auth_token worker_generated_auth_token = var.worker_generated_auth_token
} }
+11 -11
View File
@@ -1,19 +1,19 @@
provider "boundary" { provider "boundary" {
addr = "http://127.0.0.1:9200" addr = "http://127.0.0.1:9200"
auth_method_id = "ampw_1234567890" # changeme auth_method_id = "ampw_1234567890" # changeme
password_auth_method_login_name = "myuser" # changeme auth_method_login_name = "myuser" # changeme
password_auth_method_password = "passpass" # changeme auth_method_password = "passpass" # changeme
} }
provider "boundary" { provider "boundary" {
addr = "http://127.0.0.1:9200" addr = "http://127.0.0.1:9200"
password_auth_method_login_name = "myuser" auth_method_login_name = "myuser"
password_auth_method_password = "passpass" auth_method_password = "passpass"
} }
provider "boundary" { provider "boundary" {
addr = "http://127.0.0.1:9200" addr = "http://127.0.0.1:9200"
password_auth_method_login_name = "myuser" auth_method_login_name = "myuser"
password_auth_method_password = "passpass" auth_method_password = "passpass"
scope_id = "s_1234567890" scope_id = "s_1234567890"
} }
@@ -0,0 +1 @@
terraform import boundary_alias_target.example_alias_target <my-id>
@@ -0,0 +1,62 @@
resource "boundary_scope" "org" {
name = "organization_one"
description = "global scope"
scope_id = "global"
auto_create_admin_role = true
auto_create_default_role = true
}
resource "boundary_scope" "project" {
name = "project_one"
description = "My first scope!"
scope_id = boundary_scope.org.id
auto_create_admin_role = true
}
resource "boundary_host_catalog_static" "foo" {
name = "test"
description = "test catalog"
scope_id = boundary_scope.project.id
}
resource "boundary_host_static" "foo" {
name = "foo"
host_catalog_id = boundary_host_catalog_static.foo.id
address = "10.0.0.1"
}
resource "boundary_host_static" "bar" {
name = "bar"
host_catalog_id = boundary_host_catalog_static.foo.id
address = "127.0.0.1"
}
resource "boundary_host_set_static" "foo" {
name = "foo"
host_catalog_id = boundary_host_catalog_static.foo.id
host_ids = [
boundary_host_static.foo.id,
boundary_host_static.bar.id,
]
}
resource "boundary_target" "foo" {
name = "foo"
description = "Foo target"
type = "tcp"
default_port = "22"
scope_id = boundary_scope.project.id
host_source_ids = [
boundary_host_set_static.foo.id,
]
}
resource "boundary_alias_target" "example_alias_target" {
name = "example_alias_target"
description = "Example alias to target foo using host boundary_host_static.bar"
scope_id = "global"
value = "example.bar.foo.boundary"
destination_id = boundary_target.foo.id
authorize_session_host_id = boundary_host_static.bar.id
}
@@ -0,0 +1,5 @@
resource "boundary_worker" "controller_led" {
scope_id = "global"
name = "controller-led-worker-1"
description = "self managed worker with controller led auth"
}
@@ -1,13 +0,0 @@
resource "boundary_worker" "controller_led" {
scope_id = "global"
name = "worker 1"
description = "self managed worker with controller-led auth"
worker_generated_auth_token = var.worker_generated_auth_token
}
resource "boundary_worker" "worker_led" {
scope_id = "global"
name = "worker 2"
description = "self managed worker with worker-led auth"
worker_generated_auth_token = var.worker_generated_auth_token
}
@@ -1,12 +1,6 @@
resource "boundary_worker" "controller_led" {
scope_id = "global"
name = "worker 1"
description = "self managed worker with controller led auth"
}
resource "boundary_worker" "worker_led" { resource "boundary_worker" "worker_led" {
scope_id = "global" scope_id = "global"
name = "worker 2" name = "worker-led-worker-1"
description = "self managed worker with worker led auth" description = "self managed worker with worker led auth"
worker_generated_auth_token = var.worker_generated_auth_token worker_generated_auth_token = var.worker_generated_auth_token
} }
+87 -85
View File
@@ -1,94 +1,95 @@
module github.com/hashicorp/terraform-provider-boundary module github.com/hashicorp/terraform-provider-boundary
go 1.21.5 go 1.23.1
require ( require (
github.com/YakDriver/regexache v0.23.0 github.com/YakDriver/regexache v0.23.0
github.com/hashicorp/boundary v0.15.0 github.com/hashicorp/boundary v0.18.0
github.com/hashicorp/boundary/api v0.0.46-0.20240209231500-1b1c8b3bf9a6 github.com/hashicorp/boundary/api v0.0.53
github.com/hashicorp/boundary/sdk v0.0.43-0.20240209231500-1b1c8b3bf9a6 github.com/hashicorp/boundary/sdk v0.0.49
github.com/hashicorp/cap v0.5.0 github.com/hashicorp/cap v0.5.1-0.20240315182732-faa330bfb8df
github.com/hashicorp/cap/ldap v0.0.0-20240206183135-ed8f24513744 github.com/hashicorp/cap/ldap v0.0.0-20240206183135-ed8f24513744
github.com/hashicorp/go-cty v1.4.1-0.20200723130312-85980079f637 github.com/hashicorp/go-cty v1.4.1-0.20200723130312-85980079f637
github.com/hashicorp/go-kms-wrapping/v2 v2.0.16 github.com/hashicorp/go-kms-wrapping/v2 v2.0.17-0.20240313190905-91d44aa8e360
github.com/hashicorp/go-secure-stdlib/configutil/v2 v2.0.11 github.com/hashicorp/go-secure-stdlib/configutil/v2 v2.0.11
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8
github.com/hashicorp/go-secure-stdlib/pluginutil/v2 v2.0.6 github.com/hashicorp/go-secure-stdlib/pluginutil/v2 v2.0.7
github.com/hashicorp/terraform-plugin-docs v0.18.0 github.com/hashicorp/terraform-plugin-docs v0.18.0
github.com/hashicorp/terraform-plugin-sdk/v2 v2.32.0 github.com/hashicorp/terraform-plugin-sdk/v2 v2.33.0
github.com/jimlambrt/gldap v0.1.9 github.com/jimlambrt/gldap v0.1.11
github.com/kr/pretty v0.3.1 github.com/kr/pretty v0.3.1
github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/go-homedir v1.1.0
github.com/stretchr/testify v1.8.4 github.com/stretchr/testify v1.9.0
golang.org/x/crypto v0.19.0 golang.org/x/crypto v0.25.0
mvdan.cc/gofumpt v0.6.0 mvdan.cc/gofumpt v0.6.0
) )
require ( require (
dario.cat/mergo v1.0.0 // indirect
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
github.com/DATA-DOG/go-sqlmock v1.5.0 // indirect github.com/DATA-DOG/go-sqlmock v1.5.2 // indirect
github.com/Kunde21/markdownfmt/v3 v3.1.0 // indirect github.com/Kunde21/markdownfmt/v3 v3.1.0 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver/v3 v3.2.0 // indirect github.com/Masterminds/semver/v3 v3.2.1 // indirect
github.com/Masterminds/sprig/v3 v3.2.3 // indirect github.com/Masterminds/sprig/v3 v3.2.3 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/ProtonMail/go-crypto v1.1.0-alpha.0 // indirect
github.com/agext/levenshtein v1.2.2 // indirect github.com/agext/levenshtein v1.2.2 // indirect
github.com/alessio/shellescape v1.4.1 // indirect github.com/alessio/shellescape v1.4.2 // indirect
github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect github.com/apparentlymart/go-textseg/v15 v15.0.0 // indirect
github.com/armon/go-radix v1.0.0 // indirect github.com/armon/go-radix v1.0.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/bgentry/speakeasy v0.1.0 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect
github.com/cenkalti/backoff v2.2.1+incompatible // indirect github.com/cenkalti/backoff v2.2.1+incompatible // indirect
github.com/cenkalti/backoff/v3 v3.0.0 // indirect github.com/cenkalti/backoff/v3 v3.2.2 // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cloudflare/circl v1.3.7 // indirect github.com/cloudflare/circl v1.3.7 // indirect
github.com/containerd/continuity v0.3.0 // indirect github.com/containerd/continuity v0.4.3 // indirect
github.com/coreos/go-oidc/v3 v3.8.0 // indirect github.com/coreos/go-oidc/v3 v3.9.0 // indirect
github.com/danieljoos/wincred v1.2.0 // indirect github.com/danieljoos/wincred v1.2.1 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/docker/cli v23.0.1+incompatible // indirect github.com/docker/cli v25.0.3+incompatible // indirect
github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/docker v27.1.1+incompatible // indirect
github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-units v0.5.0 // indirect github.com/docker/go-units v0.5.0 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect github.com/dustin/go-humanize v1.0.1 // indirect
github.com/dvsekhvalnov/jose2go v1.5.1-0.20231206184617-48ba0b76bc88 // indirect github.com/dvsekhvalnov/jose2go v1.6.0 // indirect
github.com/fatih/color v1.16.0 // indirect github.com/fatih/color v1.17.0 // indirect
github.com/fatih/structs v1.1.0 // indirect github.com/fatih/structs v1.1.0 // indirect
github.com/glebarez/go-sqlite v1.21.2 // indirect github.com/glebarez/go-sqlite v1.22.0 // indirect
github.com/glebarez/sqlite v1.9.0 // indirect github.com/glebarez/sqlite v1.10.0 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
github.com/go-jose/go-jose/v3 v3.0.1 // indirect github.com/go-jose/go-jose/v3 v3.0.3 // indirect
github.com/go-ldap/ldap/v3 v3.4.6 // indirect github.com/go-ldap/ldap/v3 v3.4.6 // indirect
github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect
github.com/gogo/protobuf v1.3.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-migrate/migrate/v4 v4.16.2 // indirect github.com/golang-migrate/migrate/v4 v4.17.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect github.com/golang/protobuf v1.5.3 // indirect
github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-cmp v0.6.0 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/google/uuid v1.4.0 // indirect github.com/google/uuid v1.6.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 // indirect
github.com/hashicorp/cli v1.1.6 // indirect github.com/hashicorp/cli v1.1.6 // indirect
github.com/hashicorp/dbassert v0.0.0-20231012105025-1bc1bd88e22b // indirect github.com/hashicorp/dbassert v0.0.0-20231012105025-1bc1bd88e22b // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/eventlogger v0.2.6-0.20231025104552-802587e608f0 // indirect github.com/hashicorp/eventlogger v0.2.9 // indirect
github.com/hashicorp/eventlogger/filters/encrypt v0.1.8-0.20231025104552-802587e608f0 // indirect github.com/hashicorp/eventlogger/filters/encrypt v0.1.8-0.20231208142215-efdb51ec090d // indirect
github.com/hashicorp/go-bexpr v0.1.13 // indirect github.com/hashicorp/go-bexpr v0.1.13 // indirect
github.com/hashicorp/go-checkpoint v0.5.0 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-dbw v0.1.1 // indirect github.com/hashicorp/go-dbw v0.1.5-0.20240909162114-6cee92b3da36 // indirect
github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect
github.com/hashicorp/go-kms-wrapping/extras/kms/v2 v2.0.0-20231124110655-4315424d22d0 // indirect github.com/hashicorp/go-kms-wrapping/extras/kms/v2 v2.0.0-20231219183231-6bac757bb482 // indirect
github.com/hashicorp/go-kms-wrapping/plugin/v2 v2.0.5 // indirect github.com/hashicorp/go-kms-wrapping/plugin/v2 v2.0.7 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-plugin v1.6.0 // indirect github.com/hashicorp/go-plugin v1.6.0 // indirect
github.com/hashicorp/go-rate v0.0.0-20231204194614-cc8d401f70ab // indirect github.com/hashicorp/go-rate v0.0.0-20231204194614-cc8d401f70ab // indirect
github.com/hashicorp/go-retryablehttp v0.7.4 // indirect github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect
github.com/hashicorp/go-secure-stdlib/base62 v0.1.2 // indirect github.com/hashicorp/go-secure-stdlib/base62 v0.1.2 // indirect
github.com/hashicorp/go-secure-stdlib/gatedwriter v0.1.1 // indirect github.com/hashicorp/go-secure-stdlib/gatedwriter v0.1.1 // indirect
@@ -98,34 +99,33 @@ require (
github.com/hashicorp/go-secure-stdlib/reloadutil v0.1.1 // indirect github.com/hashicorp/go-secure-stdlib/reloadutil v0.1.1 // indirect
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect
github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.3 // indirect github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.3 // indirect
github.com/hashicorp/go-sockaddr v1.0.5 // indirect github.com/hashicorp/go-sockaddr v1.0.6 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect
github.com/hashicorp/hc-install v0.6.2 // indirect github.com/hashicorp/hc-install v0.6.3 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/hcl v1.0.1-vault-5 // indirect
github.com/hashicorp/hcl/v2 v2.19.1 // indirect github.com/hashicorp/hcl/v2 v2.19.1 // indirect
github.com/hashicorp/logutils v1.0.0 // indirect github.com/hashicorp/logutils v1.0.0 // indirect
github.com/hashicorp/nodeenrollment v0.2.9 // indirect github.com/hashicorp/nodeenrollment v0.2.13 // indirect
github.com/hashicorp/terraform-exec v0.20.0 // indirect github.com/hashicorp/terraform-exec v0.20.0 // indirect
github.com/hashicorp/terraform-json v0.21.0 // indirect github.com/hashicorp/terraform-json v0.21.0 // indirect
github.com/hashicorp/terraform-plugin-go v0.21.0 // indirect github.com/hashicorp/terraform-plugin-go v0.22.0 // indirect
github.com/hashicorp/terraform-plugin-log v0.9.0 // indirect github.com/hashicorp/terraform-plugin-log v0.9.0 // indirect
github.com/hashicorp/terraform-registry-address v0.2.3 // indirect github.com/hashicorp/terraform-registry-address v0.2.3 // indirect
github.com/hashicorp/terraform-svchost v0.1.1 // indirect github.com/hashicorp/terraform-svchost v0.1.1 // indirect
github.com/hashicorp/vault/api v1.10.0 // indirect github.com/hashicorp/vault/api v1.12.0 // indirect
github.com/hashicorp/vault/sdk v0.3.0 // indirect github.com/hashicorp/vault/sdk v0.11.0 // indirect
github.com/hashicorp/yamux v0.1.1 // indirect github.com/hashicorp/yamux v0.1.1 // indirect
github.com/huandu/xstrings v1.4.0 // indirect github.com/huandu/xstrings v1.4.0 // indirect
github.com/imdario/mergo v0.3.15 // indirect github.com/imdario/mergo v0.3.16 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect
github.com/jackc/pgconn v1.14.1 // indirect github.com/jackc/pgconn v1.14.3 // indirect
github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgio v1.0.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgproto3/v2 v2.3.2 // indirect github.com/jackc/pgproto3/v2 v2.3.3 // indirect
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgtype v1.14.0 // indirect github.com/jackc/pgx/v5 v5.6.0 // indirect
github.com/jackc/pgx/v4 v4.18.1 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/jackc/pgx/v5 v5.4.3 // indirect
github.com/jefferai/go-libsecret v0.0.0-20210525195240-b53481abef97 // indirect github.com/jefferai/go-libsecret v0.0.0-20210525195240-b53481abef97 // indirect
github.com/jefferai/isbadcipher v0.0.0-20190226160619-51d2077c035f // indirect github.com/jefferai/isbadcipher v0.0.0-20190226160619-51d2077c035f // indirect
github.com/jefferai/keyring v1.1.7-0.20220316160357-58a74bb55891 // indirect github.com/jefferai/keyring v1.1.7-0.20220316160357-58a74bb55891 // indirect
@@ -138,7 +138,6 @@ require (
github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a // indirect github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a // indirect
github.com/mitchellh/cli v1.1.5 // indirect github.com/mitchellh/cli v1.1.5 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect
@@ -147,65 +146,68 @@ require (
github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/moby/docker-image-spec v1.3.1 // indirect
github.com/moby/sys/user v0.1.0 // indirect
github.com/moby/term v0.5.0 // indirect github.com/moby/term v0.5.0 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect
github.com/mtibben/percent v0.2.1 // indirect github.com/mtibben/percent v0.2.1 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/oklog/run v1.1.0 // indirect github.com/oklog/run v1.1.0 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect
github.com/opencontainers/image-spec v1.0.2 // indirect github.com/opencontainers/image-spec v1.1.0-rc6 // indirect
github.com/opencontainers/runc v1.1.12 // indirect github.com/opencontainers/runc v1.2.0-rc.3 // indirect
github.com/ory/dockertest/v3 v3.10.0 // indirect github.com/ory/dockertest/v3 v3.10.0 // indirect
github.com/pires/go-proxyproto v0.7.0 // indirect github.com/pires/go-proxyproto v0.7.0 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/posener/complete v1.2.3 // indirect github.com/posener/complete v1.2.3 // indirect
github.com/prometheus/client_golang v1.17.0 // indirect github.com/prometheus/client_golang v1.18.0 // indirect
github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/common v0.46.0 // indirect
github.com/prometheus/procfs v0.11.1 // indirect github.com/prometheus/procfs v0.12.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/russross/blackfriday v1.6.0 // indirect github.com/russross/blackfriday v1.6.0 // indirect
github.com/ryanuber/go-glob v1.0.0 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect
github.com/sethvargo/go-diceware v0.3.0 // indirect github.com/sethvargo/go-diceware v0.3.0 // indirect
github.com/shopspring/decimal v1.3.1 // indirect github.com/shopspring/decimal v1.3.1 // indirect
github.com/sirupsen/logrus v1.9.2 // indirect github.com/sirupsen/logrus v1.9.3 // indirect
github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cast v1.6.0 // indirect
github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xeipuuv/gojsonschema v1.2.0 // indirect
github.com/xo/dburl v0.16.0 // indirect github.com/xo/dburl v0.23.1 // indirect
github.com/yuin/goldmark v1.6.0 // indirect github.com/yuin/goldmark v1.6.0 // indirect
github.com/yuin/goldmark-meta v1.1.0 // indirect github.com/yuin/goldmark-meta v1.1.0 // indirect
github.com/zalando/go-keyring v0.2.3 // indirect github.com/zalando/go-keyring v0.2.3 // indirect
github.com/zclconf/go-cty v1.14.2 // indirect github.com/zclconf/go-cty v1.14.2 // indirect
go.uber.org/atomic v1.11.0 // indirect go.uber.org/atomic v1.11.0 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect golang.org/x/exp v0.0.0-20240205201215-2c58cdc269a3 // indirect
golang.org/x/mod v0.14.0 // indirect golang.org/x/mod v0.17.0 // indirect
golang.org/x/net v0.20.0 // indirect golang.org/x/net v0.25.0 // indirect
golang.org/x/oauth2 v0.14.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect
golang.org/x/sync v0.6.0 // indirect golang.org/x/sync v0.7.0 // indirect
golang.org/x/sys v0.17.0 // indirect golang.org/x/sys v0.22.0 // indirect
golang.org/x/term v0.17.0 // indirect golang.org/x/term v0.22.0 // indirect
golang.org/x/text v0.14.0 // indirect golang.org/x/text v0.16.0 // indirect
golang.org/x/time v0.3.0 // indirect golang.org/x/time v0.5.0 // indirect
golang.org/x/tools v0.17.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect
google.golang.org/appengine v1.6.8 // indirect google.golang.org/appengine v1.6.8 // indirect
google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/genproto v0.0.0-20240205150955-31a09d347014 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240205150955-31a09d347014 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240205150955-31a09d347014 // indirect
google.golang.org/grpc v1.61.0 // indirect google.golang.org/grpc v1.61.1 // indirect
google.golang.org/protobuf v1.32.0 // indirect google.golang.org/protobuf v1.34.2 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect
gorm.io/driver/postgres v1.5.4 // indirect gorm.io/driver/postgres v1.5.9 // indirect
gorm.io/driver/sqlite v1.5.4 // indirect gorm.io/driver/sqlite v1.5.6 // indirect
gorm.io/gorm v1.25.5 // indirect gorm.io/gorm v1.25.11 // indirect
modernc.org/libc v1.22.5 // indirect modernc.org/libc v1.41.0 // indirect
modernc.org/mathutil v1.5.0 // indirect modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.5.0 // indirect modernc.org/memory v1.7.2 // indirect
modernc.org/sqlite v1.23.1 // indirect modernc.org/sqlite v1.28.0 // indirect
) )
+200 -418
View File
File diff suppressed because it is too large. Load diff
+4
View File
@@ -56,4 +56,8 @@ const (
ParentScopeIdKey = "parent_scope_id" ParentScopeIdKey = "parent_scope_id"
// GroupMemberIdsKey is used for common "member_ids" resource attribute // GroupMemberIdsKey is used for common "member_ids" resource attribute
GroupMemberIdsKey = "member_ids" GroupMemberIdsKey = "member_ids"
// ValueKey is used for common "value" resource attribute
ValueKey = "value"
// DestinationIdKey is used for common "destination_id" resource attribute
DestinationIdKey = "destination_id"
) )
+1 -1
View File
@@ -83,7 +83,7 @@ func TestAccUserDataSource_globalAdminUser(t *testing.T) {
resource.TestCheckResourceAttr(dataSourceName, LoginNameKey, "testuser"), resource.TestCheckResourceAttr(dataSourceName, LoginNameKey, "testuser"),
resource.TestMatchResourceAttr(dataSourceName, IDKey, regexache.MustCompile(`^u_.+`)), resource.TestMatchResourceAttr(dataSourceName, IDKey, regexache.MustCompile(`^u_.+`)),
resource.TestMatchResourceAttr(dataSourceName, PrimaryAccountIdKey, regexache.MustCompile(`^acctpw_.+`)), resource.TestMatchResourceAttr(dataSourceName, PrimaryAccountIdKey, regexache.MustCompile(`^acctpw_.+`)),
resource.TestCheckResourceAttr(dataSourceName, "authorized_actions.#", "7"), resource.TestCheckResourceAttr(dataSourceName, "authorized_actions.#", "8"),
resource.TestCheckResourceAttr(dataSourceName, "scope.0.name", "global"), resource.TestCheckResourceAttr(dataSourceName, "scope.0.name", "global"),
resource.TestCheckResourceAttr(dataSourceName, "scope.0.id", "global"), resource.TestCheckResourceAttr(dataSourceName, "scope.0.id", "global"),
resource.TestCheckResourceAttr(dataSourceName, "scope.0.type", "global"), resource.TestCheckResourceAttr(dataSourceName, "scope.0.type", "global"),
+1
View File
@@ -98,6 +98,7 @@ func New() *schema.Provider {
"boundary_account_password": resourceAccountPassword(), "boundary_account_password": resourceAccountPassword(),
"boundary_account_oidc": resourceAccountOidc(), "boundary_account_oidc": resourceAccountOidc(),
"boundary_account_ldap": resourceAccountLdap(), "boundary_account_ldap": resourceAccountLdap(),
"boundary_alias_target": resourceAliasTarget(),
"boundary_auth_method": resourceAuthMethod(), "boundary_auth_method": resourceAuthMethod(),
"boundary_auth_method_password": resourceAuthMethodPassword(), "boundary_auth_method_password": resourceAuthMethodPassword(),
"boundary_auth_method_oidc": resourceAuthMethodOidc(), "boundary_auth_method_oidc": resourceAuthMethodOidc(),
+35
View File
@@ -106,6 +106,19 @@ provider "boundary" {
func testConfigWithDefaultAuthMethod(url string, res ...string) string { func testConfigWithDefaultAuthMethod(url string, res ...string) string {
provider := fmt.Sprintf(` provider := fmt.Sprintf(`
provider "boundary" {
addr = "%s"
auth_method_login_name = "%s"
auth_method_password = "%s"
}`, url, tcLoginName, tcPassword)
c := []string{provider}
c = append(c, res...)
return strings.Join(c, "\n")
}
func testConfigWithDeprecatedAuthMethod(url string, res ...string) string {
provider := fmt.Sprintf(`
provider "boundary" { provider "boundary" {
addr = "%s" addr = "%s"
password_auth_method_login_name = "%s" password_auth_method_login_name = "%s"
@@ -256,6 +269,28 @@ func TestConfigWithDefaultAuthMethod(t *testing.T) {
}) })
} }
func TestConfigWithDeprecatedAuthMethod(t *testing.T) {
tc := controller.NewTestController(t, tcConfig...)
defer tc.Shutdown()
url := tc.ApiAddrs()[0]
var provider *schema.Provider
resource.Test(t, resource.TestCase{
IsUnitTest: true,
ProviderFactories: providerFactories(&provider),
CheckDestroy: testAccCheckScopeResourceDestroy(t, provider),
Steps: []resource.TestStep{
{
Config: testConfigWithDeprecatedAuthMethod(url, fooOrg, firstProjectFoo, secondProject),
Check: resource.ComposeTestCheckFunc(
testAccCheckScopeResourceExists(provider, "boundary_scope.org1"),
testProviderTokenExists(provider),
),
},
},
})
}
func TestConfigWithoutAMPWCredentials(t *testing.T) { func TestConfigWithoutAMPWCredentials(t *testing.T) {
tc := controller.NewTestController(t, tcConfig...) tc := controller.NewTestController(t, tcConfig...)
defer tc.Shutdown() defer tc.Shutdown()
+269
View File
@@ -0,0 +1,269 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package provider
import (
"context"
"net/http"
"github.com/hashicorp/boundary/api"
"github.com/hashicorp/boundary/api/aliases"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
const (
aliasTypeTarget = "target"
aliasTargetAuthorizeSessionHostIdKey = "authorize_session_host_id"
)
func resourceAliasTarget() *schema.Resource {
return &schema.Resource{
Description: "The target alias resource allows you to configure a Boundary target alias.",
CreateContext: resourceTargetAliasCreate,
ReadContext: resourceTargetAliasRead,
UpdateContext: resourceTargetAliasUpdate,
DeleteContext: resourceTargetAliasDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Schema: map[string]*schema.Schema{
IDKey: {
Description: "The ID of the account.",
Type: schema.TypeString,
Computed: true,
},
NameKey: {
Description: "The alias name. Defaults to the resource name.",
Type: schema.TypeString,
Optional: true,
},
DescriptionKey: {
Description: "The alias description.",
Type: schema.TypeString,
Optional: true,
},
ScopeIdKey: {
Description: "The scope ID.",
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
ValueKey: {
Description: "The value of the alias.",
Type: schema.TypeString,
Required: true,
},
DestinationIdKey: {
Description: "The destination of the alias.",
Type: schema.TypeString,
Optional: true,
},
// Target specific configurable parameters
aliasTargetAuthorizeSessionHostIdKey: {
Description: "The host id to pass to Boundary when performing an authorize session action.",
Type: schema.TypeString,
Optional: true,
},
TypeKey: {
Description: "The type of alias; hardcoded.",
Type: schema.TypeString,
Default: aliasTypeTarget,
Optional: true,
},
},
}
}
func setFromTargetAliasResponseMap(d *schema.ResourceData, raw map[string]interface{}) error {
if err := d.Set(NameKey, raw["name"]); err != nil {
return err
}
if err := d.Set(DescriptionKey, raw["description"]); err != nil {
return err
}
if err := d.Set(ScopeIdKey, raw["scope_id"]); err != nil {
return err
}
if err := d.Set(ValueKey, raw["value"]); err != nil {
return err
}
if err := d.Set(DestinationIdKey, raw["destination_id"]); err != nil {
return err
}
if err := d.Set(TypeKey, raw["type"]); err != nil {
return err
}
if attrsVal, ok := raw["attributes"]; ok {
attrs := attrsVal.(map[string]interface{})
tarAttrs, err := aliases.AttributesMapToTargetAliasAttributes(attrs)
if err != nil {
return err
}
if tarAttrs.AuthorizeSessionArguments != nil && tarAttrs.AuthorizeSessionArguments.HostId != "" {
if err := d.Set(aliasTargetAuthorizeSessionHostIdKey, tarAttrs.AuthorizeSessionArguments.HostId); err != nil {
return err
}
}
}
d.SetId(raw["id"].(string))
return nil
}
func resourceTargetAliasCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
md := meta.(*metaData)
var scopeId string
if scopeIdVal, ok := d.GetOk(ScopeIdKey); ok {
scopeId = scopeIdVal.(string)
} else {
return diag.Errorf("no scope ID provided")
}
var typeStr string
if typeVal, ok := d.GetOk(TypeKey); ok {
typeStr = typeVal.(string)
} else {
return diag.Errorf("no type provided")
}
opts := []aliases.Option{}
if typeVal, ok := d.GetOk(ValueKey); ok {
opts = append(opts, aliases.WithValue(typeVal.(string)))
} else {
return diag.Errorf("no alias value provided")
}
if nameVal, ok := d.GetOk(NameKey); ok {
opts = append(opts, aliases.WithName(nameVal.(string)))
}
if descVal, ok := d.GetOk(DescriptionKey); ok {
opts = append(opts, aliases.WithDescription(descVal.(string)))
}
if destVal, ok := d.GetOk(DestinationIdKey); ok {
opts = append(opts, aliases.WithDestinationId(destVal.(string)))
}
if hostIdVal, ok := d.GetOk(aliasTargetAuthorizeSessionHostIdKey); ok {
opts = append(opts, aliases.WithTargetAliasAuthorizeSessionArgumentsHostId(hostIdVal.(string)))
}
aliasClient := aliases.NewClient(md.client)
alcr, err := aliasClient.Create(ctx, typeStr, scopeId, opts...)
if err != nil {
return diag.Errorf("error creating alias: %v", err)
}
if alcr == nil {
return diag.Errorf("nil alias after create")
}
if err := setFromTargetAliasResponseMap(d, alcr.GetResponse().Map); err != nil {
return diag.FromErr(err)
}
return nil
}
func resourceTargetAliasRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
md := meta.(*metaData)
alClient := aliases.NewClient(md.client)
alrr, err := alClient.Read(ctx, d.Id())
if err != nil {
if apiErr := api.AsServerError(err); apiErr.Response().StatusCode() == http.StatusNotFound {
d.SetId("")
return nil
}
return diag.Errorf("error reading auth method: %v", err)
}
if alrr == nil {
return diag.Errorf("auth method nil after read")
}
if err := setFromTargetAliasResponseMap(d, alrr.GetResponse().Map); err != nil {
return diag.FromErr(err)
}
return nil
}
func resourceTargetAliasUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
md := meta.(*metaData)
alClient := aliases.NewClient(md.client)
opts := []aliases.Option{}
if d.HasChange(NameKey) {
opts = append(opts, aliases.DefaultName())
if nameVal, ok := d.GetOk(NameKey); ok {
opts = append(opts, aliases.WithName(nameVal.(string)))
}
}
if d.HasChange(DescriptionKey) {
opts = append(opts, aliases.DefaultDescription())
if descVal, ok := d.GetOk(DescriptionKey); ok {
opts = append(opts, aliases.WithDescription(descVal.(string)))
}
}
if d.HasChange(ValueKey) {
if valVal, ok := d.GetOk(ValueKey); ok {
opts = append(opts, aliases.WithValue(valVal.(string)))
} else {
return diag.Errorf("no value provided")
}
}
if d.HasChange(DestinationIdKey) {
opts = append(opts, aliases.DefaultDestinationId())
if destId, ok := d.GetOk(DestinationIdKey); ok {
opts = append(opts, aliases.WithDestinationId(destId.(string)))
}
}
if d.HasChange(aliasTargetAuthorizeSessionHostIdKey) {
opts = append(opts, aliases.DefaultTargetAliasAuthorizeSessionArgumentsHostId())
if authSessHostId, ok := d.GetOk(aliasTargetAuthorizeSessionHostIdKey); ok {
opts = append(opts, aliases.WithTargetAliasAuthorizeSessionArgumentsHostId(authSessHostId.(string)))
}
}
if len(opts) > 0 {
opts = append(opts, aliases.WithAutomaticVersioning(true))
alur, err := alClient.Update(ctx, d.Id(), 0, opts...)
if err != nil {
return diag.Errorf("error updating auth method: %v", err)
}
if err := setFromTargetAliasResponseMap(d, alur.GetResponse().Map); err != nil {
return diag.FromErr(err)
}
return nil
}
return nil
}
func resourceTargetAliasDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
md := meta.(*metaData)
client := aliases.NewClient(md.client)
_, err := client.Delete(ctx, d.Id())
if err != nil {
return diag.Errorf("error deleting alias: %v", err)
}
return nil
}
@@ -0,0 +1,187 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package provider
import (
"context"
"fmt"
"net/http"
"testing"
"github.com/hashicorp/boundary/api"
"github.com/hashicorp/boundary/api/aliases"
"github.com/hashicorp/boundary/testing/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
)
type aliasDestroyType string
const (
targetAliasType aliasDestroyType = "boundary_alias_target"
targetAliasResc = "boundary_alias_target.example"
targetAliasName = "foo"
targetAliasDesc = "the foo"
targetAliasValue = "value.example"
targetAliasValueUpdated = "value.example.updated"
targetAliasNamespace = "target"
targetAliasUpdate = "_random"
)
var fooBarTarget = `
resource "boundary_target" "foo" {
type = "tcp"
name = "test"
description = "test target"
default_port = 22
address = "127.0.0.1"
scope_id = boundary_scope.proj1.id
depends_on = [boundary_role.proj1_admin]
}`
var aliasId string
func targetAliasResource(name string, description string, value string) string {
return fmt.Sprintf(`
resource "boundary_alias_target" "example" {
name = "%s"
description = "%s"
value = "%s"
scope_id = "global"
destination_id = boundary_target.foo.id
authorize_session_host_id = "hst_1234567890"
depends_on = [boundary_target.foo]
}`, name, description, value)
}
func TestAccAliasTarget(t *testing.T) {
tc := controller.NewTestController(t, tcConfig...)
defer tc.Shutdown()
url := tc.ApiAddrs()[0]
res := targetAliasResource(targetAliasName, targetAliasDesc, targetAliasValue)
resUpdate := targetAliasResource(targetAliasName+targetAliasUpdate,
targetAliasDesc+targetAliasUpdate, targetAliasValueUpdated)
var provider *schema.Provider
resource.Test(t, resource.TestCase{
ProviderFactories: providerFactories(&provider),
CheckDestroy: testAccCheckAliasResourceDestroy(t, provider, targetAliasType),
Steps: []resource.TestStep{
{
// create
Config: testConfig(url, fooOrg, firstProjectFoo, fooBarTarget, res),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(targetAliasResc, NameKey, targetAliasName),
resource.TestCheckResourceAttr(targetAliasResc, DescriptionKey, targetAliasDesc),
resource.TestCheckResourceAttr(targetAliasResc, ValueKey, targetAliasValue),
testAccCheckAliasResourceExists(provider, targetAliasResc),
),
},
importStep(targetAliasResc),
{
// update
Config: testConfig(url, fooOrg, firstProjectFoo, fooBarTarget, resUpdate),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(targetAliasResc, NameKey, targetAliasName+targetAliasUpdate),
resource.TestCheckResourceAttr(targetAliasResc, DescriptionKey, targetAliasDesc+targetAliasUpdate),
resource.TestCheckResourceAttr(targetAliasResc, ValueKey, targetAliasValueUpdated),
testAccCheckAliasResourceExists(provider, targetAliasResc),
),
},
importStep(targetAliasResc),
{
// Run a plan only update and verify no changes
PlanOnly: true,
Config: testConfig(url, fooOrg, firstProjectFoo, fooBarTarget, resUpdate),
},
importStep(targetAliasResc),
{
// update again but apply a preConfig to externally update resource
// TODO: Boundary currently causes an error on moving back to a previously
// used token, for now verify that a plan only step had changes
PreConfig: func() { targetAliasExternalUpdate(t, provider) },
PlanOnly: true,
ExpectNonEmptyPlan: true,
Config: testConfig(url, fooOrg, firstProjectFoo, fooBarTarget, resUpdate),
},
importStep(targetAliasResc),
},
})
}
func targetAliasExternalUpdate(t *testing.T, testProvider *schema.Provider) {
if aliasId == "" {
t.Fatal("aliasId must be set before testing an external update")
}
md := testProvider.Meta().(*metaData)
ac := aliases.NewClient(md.client)
ar, err := ac.Read(context.Background(), aliasId)
if err != nil {
t.Fatal(fmt.Errorf("got an error reading %q: %w", storeId, err))
}
// update alias options
var opts []aliases.Option
opts = append(opts, aliases.WithDescription("this is an updated description, my guy"))
_, err = ac.Update(context.Background(), ar.Item.Id, ar.Item.Version, opts...)
if err != nil {
t.Fatal(fmt.Errorf("got an error updating %q: %w", ar.Item.Id, err))
}
}
func testAccCheckAliasResourceExists(testProvider *schema.Provider, name string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[name]
if !ok {
return fmt.Errorf("not found: %s", name)
}
id := rs.Primary.ID
if id == "" {
return fmt.Errorf("no ID is set")
}
aliasId = id
md := testProvider.Meta().(*metaData)
c := aliases.NewClient(md.client)
if _, err := c.Read(context.Background(), id); err != nil {
return fmt.Errorf("got an error reading %q: %w", id, err)
}
return nil
}
}
func testAccCheckAliasResourceDestroy(t *testing.T, testProvider *schema.Provider, typ aliasDestroyType) resource.TestCheckFunc {
return func(s *terraform.State) error {
if testProvider.Meta() == nil {
t.Fatal("got nil provider metadata")
}
md := testProvider.Meta().(*metaData)
for _, rs := range s.RootModule().Resources {
switch rs.Type {
case string(typ):
id := rs.Primary.ID
c := aliases.NewClient(md.client)
_, err := c.Read(context.Background(), id)
if apiErr := api.AsServerError(err); apiErr == nil || apiErr.Response().StatusCode() != http.StatusNotFound {
return fmt.Errorf("didn't get a 404 when reading destroyed target alias %q: %v", id, err)
}
default:
continue
}
}
return nil
}
}
@@ -118,6 +118,11 @@ func resourceHostCatalogPlugin() *schema.Resource {
Optional: true, Optional: true,
Computed: true, Computed: true,
}, },
WorkerFilterKey: {
Description: "HCP Only. A filter used to control which PKI workers can handle dynamic host catalog requests.",
Type: schema.TypeString,
Optional: true,
},
internalSecretsConfigHmacKey: { internalSecretsConfigHmacKey: {
Description: "Internal only. HMAC of (serverSecretsHmac + config secrets). Used for proper secrets handling.", Description: "Internal only. HMAC of (serverSecretsHmac + config secrets). Used for proper secrets handling.",
Type: schema.TypeString, Type: schema.TypeString,
@@ -294,6 +299,9 @@ func setFromHostCatalogPluginResponseMap(d *schema.ResourceData, raw map[string]
if err := d.Set(ScopeIdKey, raw[ScopeIdKey]); err != nil { if err := d.Set(ScopeIdKey, raw[ScopeIdKey]); err != nil {
return err return err
} }
if err := d.Set(WorkerFilterKey, raw[WorkerFilterKey]); err != nil {
return err
}
// Plugin stuff // Plugin stuff
{ {
if err := d.Set(PluginIdKey, raw[PluginIdKey]); err != nil { if err := d.Set(PluginIdKey, raw[PluginIdKey]); err != nil {
@@ -399,6 +407,12 @@ func resourceHostCatalogPluginCreate(ctx context.Context, d *schema.ResourceData
opts = append(opts, hostcatalogs.WithDescription(descStr)) opts = append(opts, hostcatalogs.WithDescription(descStr))
} }
workerFilterVal, ok := d.GetOk(WorkerFilterKey)
if ok {
workerFilterStr := workerFilterVal.(string)
opts = append(opts, hostcatalogs.WithWorkerFilter(workerFilterStr))
}
attrsVal, ok := d.GetOk(AttributesJsonKey) attrsVal, ok := d.GetOk(AttributesJsonKey)
if ok { if ok {
attrsStr, err := parseutil.ParsePath(attrsVal.(string)) attrsStr, err := parseutil.ParsePath(attrsVal.(string))
@@ -556,6 +570,15 @@ func resourceHostCatalogPluginUpdate(ctx context.Context, d *schema.ResourceData
} }
} }
if d.HasChange(WorkerFilterKey) {
opts = append(opts, hostcatalogs.DefaultWorkerFilter())
workerFilterVal, ok := d.GetOk(WorkerFilterKey)
if ok {
workerFilterStr := workerFilterVal.(string)
opts = append(opts, hostcatalogs.WithWorkerFilter(workerFilterStr))
}
}
if d.HasChange(AttributesJsonKey) { if d.HasChange(AttributesJsonKey) {
attrsVal, ok := d.GetOk(AttributesJsonKey) attrsVal, ok := d.GetOk(AttributesJsonKey)
if ok { if ok {
@@ -22,6 +22,9 @@ const (
testPluginHostCatalogDescription = "bar" testPluginHostCatalogDescription = "bar"
testPluginHostCatalogDescriptionUpdate = "bar foo" testPluginHostCatalogDescriptionUpdate = "bar foo"
testPluginHostCatalogDescriptionUpdate2 = "bar foo foo" testPluginHostCatalogDescriptionUpdate2 = "bar foo foo"
testPluginHostCatalogWorkerFilterUpdate = "\"dev\" in \"/tags/type\""
testPluginHostCatalogWorkerFilterUpdate2 = "\"pki\" in \"/tags/type\""
) )
// expectedAttributesState is used here and in plugin host sets to control how // expectedAttributesState is used here and in plugin host sets to control how
@@ -244,6 +247,212 @@ func TestAccPluginHostCatalog(t *testing.T) {
}) })
} }
func TestAccPluginHostCatalogWithWorkerFilter(t *testing.T) {
t.Skip("Skipping test until Boundary Terraform Provider can unit tests for Boundary Enterprise only features")
tc := controller.NewTestController(t, tcConfig...)
defer tc.Shutdown()
url := tc.ApiAddrs()[0]
resName := "boundary_host_catalog_plugin.foo"
initialValuesStr := fmt.Sprintf(`
description = "%s"
attributes_json = jsonencode({
foo = "bar"
zip = "zap"
})
secrets_json = jsonencode({
hush = "puppies"
})
`,
testPluginHostCatalogDescription,
)
// Changed description, secrets and added worker filter.
valuesStrUpdate1 := fmt.Sprintf(`
description = "%s"
worker_filter = %q
attributes_json = jsonencode({
foo = "bar"
zip = "zoop"
})
secrets_json = jsonencode({
flush = "fluppies"
})
`,
testPluginHostCatalogDescriptionUpdate,
testPluginHostCatalogWorkerFilterUpdate,
)
// Changed description, no secrets update, nullify worker filter.
valuesStrUpdate2 := fmt.Sprintf(`
description = "%s"
worker_filter = null
attributes_json = jsonencode({
foo = "bar"
zip = "zoop"
})
secrets_json = jsonencode({
flush = "fluppies"
})
`,
testPluginHostCatalogDescriptionUpdate2,
)
// Same description and set a worker filter again, now empty secrets.
valuesStrUpdate3 := fmt.Sprintf(`
description = "%s"
worker_filter = %q
attributes_json = jsonencode({
foo = "bar"
zip = "zoop"
})
`,
testPluginHostCatalogDescriptionUpdate2,
testPluginHostCatalogWorkerFilterUpdate2,
)
// Same description, now explicitly unset secrets and blankify attrs and
// worker filter.
valuesStrUpdate4 := fmt.Sprintf(`
description = "%s"
secrets_json = "null"
`,
testPluginHostCatalogDescriptionUpdate2,
)
// Set values again
valuesStrUpdate5 := fmt.Sprintf(`
description = "%s"
worker_filter = %q
attributes_json = jsonencode({
foo = "bar"
zip = "zoop"
})
secrets_json = jsonencode({
flush = "fluppies"
})
`,
testPluginHostCatalogDescriptionUpdate2,
testPluginHostCatalogWorkerFilterUpdate2,
)
// Explicitly set both secrets and attributes to null
valuesStrUpdate6 := fmt.Sprintf(`
description = "%s"
worker_filter = %q
attributes_json = "null"
secrets_json = "null"
`,
testPluginHostCatalogDescriptionUpdate2,
testPluginHostCatalogWorkerFilterUpdate2,
)
initialHcl := fmt.Sprintf(projPluginHostCatalogBase, initialValuesStr)
update1Hcl := fmt.Sprintf(projPluginHostCatalogBase, valuesStrUpdate1)
update2Hcl := fmt.Sprintf(projPluginHostCatalogBase, valuesStrUpdate2)
update3Hcl := fmt.Sprintf(projPluginHostCatalogBase, valuesStrUpdate3)
update4Hcl := fmt.Sprintf(projPluginHostCatalogBase, valuesStrUpdate4)
update5Hcl := fmt.Sprintf(projPluginHostCatalogBase, valuesStrUpdate5)
update6Hcl := fmt.Sprintf(projPluginHostCatalogBase, valuesStrUpdate6)
var provider *schema.Provider
resource.Test(t, resource.TestCase{
ProviderFactories: providerFactories(&provider),
CheckDestroy: testAccCheckHostCatalogResourceDestroy(t, provider, baseHostCatalogType),
Steps: []resource.TestStep{
{
// test create
Config: testConfig(url, fooOrg, firstProjectFoo, initialHcl),
Check: resource.ComposeTestCheckFunc(
testAccCheckScopeResourceExists(provider, "boundary_scope.org1"),
testAccCheckScopeResourceExists(provider, "boundary_scope.proj1"),
testAccCheckPluginHostCatalogResourceExists(provider, resName, expectedAttributesStatePreviouslyEmptyNowSet),
resource.TestCheckResourceAttr(resName, DescriptionKey, testPluginHostCatalogDescription),
),
ExpectNonEmptyPlan: true,
},
importStep(resName, SecretsJsonKey, internalHmacUsedForSecretsConfigHmacKey, internalForceUpdateKey, internalSecretsConfigHmacKey),
{
// test update
Config: testConfig(url, fooOrg, firstProjectFoo, update1Hcl),
Check: resource.ComposeTestCheckFunc(
testAccCheckPluginHostCatalogResourceExists(provider, resName, expectedAttributesStatePreviouslySetButChanged),
resource.TestCheckResourceAttr(resName, DescriptionKey, testPluginHostCatalogDescriptionUpdate),
resource.TestCheckResourceAttr(resName, WorkerFilterKey, testPluginHostCatalogWorkerFilterUpdate),
),
ExpectNonEmptyPlan: true,
},
importStep(resName, SecretsJsonKey, internalHmacUsedForSecretsConfigHmacKey, internalForceUpdateKey, internalSecretsConfigHmacKey),
{
// test update
Config: testConfig(url, fooOrg, firstProjectFoo, update2Hcl),
Check: resource.ComposeTestCheckFunc(
testAccCheckPluginHostCatalogResourceExists(provider, resName, expectedAttributesStatePreviouslySetNoChange),
resource.TestCheckResourceAttr(resName, DescriptionKey, testPluginHostCatalogDescriptionUpdate2),
),
ExpectNonEmptyPlan: true,
},
importStep(resName, SecretsJsonKey, internalHmacUsedForSecretsConfigHmacKey, internalForceUpdateKey, internalSecretsConfigHmacKey),
{
// this runs the same HCL; mostly used in some manual checking
// to ensure update is still called even when nothing has
// changed (as we need for secrets)
Config: testConfig(url, fooOrg, firstProjectFoo, update2Hcl),
Check: resource.ComposeTestCheckFunc(
testAccCheckPluginHostCatalogResourceExists(provider, resName, expectedAttributesStatePreviouslySetNoChange),
resource.TestCheckResourceAttr(resName, DescriptionKey, testPluginHostCatalogDescriptionUpdate2),
),
ExpectNonEmptyPlan: true,
},
importStep(resName, SecretsJsonKey, internalHmacUsedForSecretsConfigHmacKey, internalForceUpdateKey, internalSecretsConfigHmacKey),
{
// test update
Config: testConfig(url, fooOrg, firstProjectFoo, update3Hcl),
Check: resource.ComposeTestCheckFunc(
testAccCheckPluginHostCatalogResourceExists(provider, resName, expectedAttributesStatePreviouslySetNoChange),
resource.TestCheckResourceAttr(resName, DescriptionKey, testPluginHostCatalogDescriptionUpdate2),
resource.TestCheckResourceAttr(resName, WorkerFilterKey, testPluginHostCatalogWorkerFilterUpdate2),
),
ExpectNonEmptyPlan: true,
},
importStep(resName, SecretsJsonKey, internalHmacUsedForSecretsConfigHmacKey, internalForceUpdateKey, internalSecretsConfigHmacKey),
{
// test update
Config: testConfig(url, fooOrg, firstProjectFoo, update4Hcl),
Check: resource.ComposeTestCheckFunc(
testAccCheckPluginHostCatalogResourceExists(provider, resName, expectedAttributesStatePreviouslySetNowEmpty),
resource.TestCheckResourceAttr(resName, DescriptionKey, testPluginHostCatalogDescriptionUpdate2),
),
ExpectNonEmptyPlan: true,
},
importStep(resName, SecretsJsonKey, internalHmacUsedForSecretsConfigHmacKey, internalForceUpdateKey, internalSecretsConfigHmacKey),
{
// test update
Config: testConfig(url, fooOrg, firstProjectFoo, update5Hcl),
Check: resource.ComposeTestCheckFunc(
testAccCheckPluginHostCatalogResourceExists(provider, resName, expectedAttributesStatePreviouslyEmptyNowSet),
resource.TestCheckResourceAttr(resName, DescriptionKey, testPluginHostCatalogDescriptionUpdate2),
resource.TestCheckResourceAttr(resName, WorkerFilterKey, testPluginHostCatalogWorkerFilterUpdate2),
),
ExpectNonEmptyPlan: true,
},
importStep(resName, SecretsJsonKey, internalHmacUsedForSecretsConfigHmacKey, internalForceUpdateKey, internalSecretsConfigHmacKey),
{
// test update
Config: testConfig(url, fooOrg, firstProjectFoo, update6Hcl),
Check: resource.ComposeTestCheckFunc(
testAccCheckPluginHostCatalogResourceExists(provider, resName, expectedAttributesStatePreviouslySetNowEmpty),
resource.TestCheckResourceAttr(resName, DescriptionKey, testPluginHostCatalogDescriptionUpdate2),
resource.TestCheckResourceAttr(resName, WorkerFilterKey, testPluginHostCatalogWorkerFilterUpdate2),
),
ExpectNonEmptyPlan: true,
},
importStep(resName, SecretsJsonKey, internalHmacUsedForSecretsConfigHmacKey, internalForceUpdateKey, internalSecretsConfigHmacKey),
},
})
}
func testAccCheckPluginHostCatalogResourceExists(testProvider *schema.Provider, name string, expAttrState expectedAttributesState) resource.TestCheckFunc { func testAccCheckPluginHostCatalogResourceExists(testProvider *schema.Provider, name string, expAttrState expectedAttributesState) resource.TestCheckFunc {
return func(s *terraform.State) error { return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[name] rs, ok := s.RootModule().Resources[name]
-37
View File
@@ -19,7 +19,6 @@ import (
) )
const ( const (
roleGrantScopeIdKey = "grant_scope_id"
roleGrantScopeIdsKey = "grant_scope_ids" roleGrantScopeIdsKey = "grant_scope_ids"
rolePrincipalIdsKey = "principal_ids" rolePrincipalIdsKey = "principal_ids"
roleGrantStringsKey = "grant_strings" roleGrantStringsKey = "grant_strings"
@@ -71,13 +70,6 @@ func resourceRole() *schema.Resource {
Optional: true, Optional: true,
Elem: &schema.Schema{Type: schema.TypeString}, Elem: &schema.Schema{Type: schema.TypeString},
}, },
roleGrantScopeIdKey: {
Description: "For Boundary 0.15+, use `grant_scope_ids` instead. The scope for which the grants in the role should apply.",
Type: schema.TypeString,
Optional: true,
Computed: true,
Deprecated: "In Boundary 0.15+, please use `grant_scope_ids` instead. This field will be removed in a future release.",
},
roleGrantScopeIdsKey: { roleGrantScopeIdsKey: {
Description: `A list of scopes for which the grants in this role should apply, which can include the special values "this", "children", or "descendants"`, Description: `A list of scopes for which the grants in this role should apply, which can include the special values "this", "children", or "descendants"`,
Type: schema.TypeSet, Type: schema.TypeSet,
@@ -108,9 +100,6 @@ func setFromRoleResponseMap(d *schema.ResourceData, raw map[string]interface{})
if err := d.Set(roleGrantScopeIdsKey, raw["grant_scope_ids"]); err != nil { if err := d.Set(roleGrantScopeIdsKey, raw["grant_scope_ids"]); err != nil {
return err return err
} }
if err := d.Set(roleGrantScopeIdKey, raw["grant_scope_id"]); err != nil {
return err
}
d.SetId(raw["id"].(string)) d.SetId(raw["id"].(string))
return nil return nil
@@ -140,11 +129,6 @@ func resourceRoleCreate(ctx context.Context, d *schema.ResourceData, meta interf
opts = append(opts, roles.WithDescription(descStr)) opts = append(opts, roles.WithDescription(descStr))
} }
grantScopeIdVal := d.Get(roleGrantScopeIdKey)
if grantScopeIdVal != "" {
grantScopeIdStr := grantScopeIdVal.(string)
opts = append(opts, roles.WithGrantScopeId(grantScopeIdStr))
}
var grantScopeIds []string var grantScopeIds []string
if grantScopeIdsVal, ok := d.GetOk(roleGrantScopeIdsKey); ok { if grantScopeIdsVal, ok := d.GetOk(roleGrantScopeIdsKey); ok {
list := grantScopeIdsVal.(*schema.Set).List() list := grantScopeIdsVal.(*schema.Set).List()
@@ -288,22 +272,6 @@ func resourceRoleUpdate(ctx context.Context, d *schema.ResourceData, meta interf
} }
} }
var grantScopeId *string
if d.HasChange(roleGrantScopeIdKey) {
// If it is an update to use the multi-value grant_scope_ids, and this
// has changed to "", then don't set it on the API. Instead let it fall
// through and below it'll be updated to be "".
if !d.HasChange(roleGrantScopeIdsKey) {
opts = append(opts, roles.DefaultGrantScopeId())
grantScopeIdVal, ok := d.GetOk(roleGrantScopeIdKey)
if ok {
grantScopeIdStr := grantScopeIdVal.(string)
grantScopeId = &grantScopeIdStr
opts = append(opts, roles.WithGrantScopeId(grantScopeIdStr))
}
}
}
if len(opts) > 0 { if len(opts) > 0 {
opts = append(opts, roles.WithAutomaticVersioning(true)) opts = append(opts, roles.WithAutomaticVersioning(true))
_, err := rc.Update(ctx, d.Id(), 0, opts...) _, err := rc.Update(ctx, d.Id(), 0, opts...)
@@ -322,11 +290,6 @@ func resourceRoleUpdate(ctx context.Context, d *schema.ResourceData, meta interf
return diag.FromErr(err) return diag.FromErr(err)
} }
} }
if d.HasChange(roleGrantScopeIdKey) {
if err := d.Set(roleGrantScopeIdKey, grantScopeId); err != nil {
return diag.FromErr(err)
}
}
var diags diag.Diagnostics var diags diag.Diagnostics
if d.HasChange(roleGrantStringsKey) { if d.HasChange(roleGrantStringsKey) {
@@ -47,22 +47,6 @@ var (
grant_scope_ids = ["this", "children", "p_foobar1234"] grant_scope_ids = ["this", "children", "p_foobar1234"]
}` }`
conversionOrgRoleWithGrantScopeId = `
resource "boundary_role" "with_grant_scope_id" {
name = "grant scope id role"
scope_id = boundary_scope.org1.id
depends_on = [boundary_role.org1_admin]
grant_scope_id = boundary_scope.org1.id
}`
conversionOrgRoleWithGrantScopeIdUpdate = `
resource "boundary_role" "with_grant_scope_id" {
name = "grant scope id role"
scope_id = boundary_scope.org1.id
depends_on = [boundary_role.org1_admin]
grant_scope_id = boundary_scope.proj1.id
}`
conversionOrgRoleWithGrantScopeIdsConversion = ` conversionOrgRoleWithGrantScopeIdsConversion = `
resource "boundary_role" "with_grant_scope_id" { resource "boundary_role" "with_grant_scope_id" {
name = "grant scope id role" name = "grant scope id role"
@@ -132,106 +116,6 @@ func TestAccRoleWithGrantScopes(t *testing.T) {
}) })
} }
// TestAccRoleGrantScopeUpgrade exercises some specific upgrade scenarios around
// grant_scope_id -> grant_scope_ids
func TestAccRoleWithGrantScopesUpdate(t *testing.T) {
tc := controller.NewTestController(t, tcConfig...)
t.Cleanup(tc.Shutdown)
url := tc.ApiAddrs()[0]
var provider *schema.Provider
resource.Test(t, resource.TestCase{
IsUnitTest: true,
ProviderFactories: providerFactories(&provider),
CheckDestroy: testAccCheckRoleResourceDestroy(t, provider),
Steps: []resource.TestStep{
{
// Create
Config: testConfig(url, fooOrg, firstProjectFoo, fooUser, conversionOrgRoleWithGrantScopeId),
Check: resource.ComposeTestCheckFunc(
testAccCheckScopeResourceExists(provider, "boundary_scope.org1"),
testAccCheckRoleResourceExists(provider, "boundary_role.with_grant_scope_id"),
testAccCheckUserResourceExists(provider, "boundary_user.foo"),
testAccCheckRoleResourceGrantScopesSet(provider, "boundary_role.with_grant_scope_id", []string{"boundary_scope.org1"}),
testAccCheckRoleResourceGrantScopeSet(provider, "boundary_role.with_grant_scope_id", "boundary_scope.org1"),
),
},
importStep("boundary_role.with_grant_scope_id"),
{
Config: testConfig(url, fooOrg, firstProjectFoo, fooUser, conversionOrgRoleWithGrantScopeIdUpdate),
Check: resource.ComposeTestCheckFunc(
testAccCheckScopeResourceExists(provider, "boundary_scope.org1"),
testAccCheckRoleResourceExists(provider, "boundary_role.with_grant_scope_id"),
testAccCheckUserResourceExists(provider, "boundary_user.foo"),
testAccCheckRoleResourceGrantScopesSet(provider, "boundary_role.with_grant_scope_id", []string{"boundary_scope.proj1"}),
testAccCheckRoleResourceGrantScopeSet(provider, "boundary_role.with_grant_scope_id", "boundary_scope.proj1"),
),
},
importStep("boundary_role.with_grant_scope_id"),
{
Config: testConfig(url, fooOrg, firstProjectFoo, fooUser, conversionOrgRoleWithGrantScopeIdsConversion),
Check: resource.ComposeTestCheckFunc(
testAccCheckScopeResourceExists(provider, "boundary_scope.org1"),
testAccCheckRoleResourceExists(provider, "boundary_role.with_grant_scope_id"),
testAccCheckUserResourceExists(provider, "boundary_user.foo"),
testAccCheckRoleResourceGrantScopesSet(provider, "boundary_role.with_grant_scope_id", []string{"this", "boundary_scope.proj1"}),
testAccCheckRoleResourceGrantScopeSet(provider, "boundary_role.with_grant_scope_id", ""),
),
},
importStep("boundary_role.with_grant_scope_id"),
{
Config: testConfig(url, fooOrg, firstProjectFoo, fooUser, conversionOrgRoleWithGrantScopeIdsUpdate),
Check: resource.ComposeTestCheckFunc(
testAccCheckScopeResourceExists(provider, "boundary_scope.org1"),
testAccCheckRoleResourceExists(provider, "boundary_role.with_grant_scope_id"),
testAccCheckUserResourceExists(provider, "boundary_user.foo"),
testAccCheckRoleResourceGrantScopesSet(provider, "boundary_role.with_grant_scope_id", []string{"this", "children"}),
testAccCheckRoleResourceGrantScopeSet(provider, "boundary_role.with_grant_scope_id", ""),
),
},
importStep("boundary_role.with_grant_scope_id"),
},
})
}
func testAccCheckRoleResourceGrantScopeSet(testProvider *schema.Provider, name string, grantScope string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[name]
if !ok {
return fmt.Errorf("role resource not found: %s", name)
}
roleId := rs.Primary.ID
scopeId := grantScope
if grantScope != "children" && grantScope != "this" && grantScope != "descendants" && grantScope != "" {
scope, ok := s.RootModule().Resources[grantScope]
if !ok {
return fmt.Errorf("scope resource not found: %s", grantScope)
}
scopeId = scope.Primary.ID
if scopeId == "" {
return fmt.Errorf("role resource ID is not set")
}
}
md := testProvider.Meta().(*metaData)
rolesClient := roles.NewClient(md.client)
rr, err := rolesClient.Read(context.Background(), roleId)
if err != nil {
return fmt.Errorf("Got an error when reading role %q: %v", roleId, err)
}
if rr.Item.GrantScopeId != scopeId {
return fmt.Errorf("grant scope id in state is %s but in boundary is %s", scopeId, rr.Item.GrantScopeId)
}
return nil
}
}
func testAccCheckRoleResourceGrantScopesSet(testProvider *schema.Provider, name string, grantScopeIds []string) resource.TestCheckFunc { func testAccCheckRoleResourceGrantScopesSet(testProvider *schema.Provider, name string, grantScopeIds []string) resource.TestCheckFunc {
return func(s *terraform.State) error { return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[name] rs, ok := s.RootModule().Resources[name]
+28
View File
@@ -0,0 +1,28 @@
---
page_title: "boundary_worker Resource - terraform-provider-boundary"
subcategory: ""
description: |-
{{ .Description | plainmarkdown | trimspace | prefixlines " " }}
---
# boundary_worker (Resource)
{{ .Description | trimspace }}
## Example Usage
### Controller-led worker
{{tffile "examples/resources/boundary_worker/controller_led.tf"}}
### Worker-led worker
{{tffile "examples/resources/boundary_worker/worker_led.tf"}}
{{ .SchemaMarkdown | trimspace }}
## Import
Import is supported using the following syntax:
{{codefile "shell" "examples/resources/boundary_worker/import.sh" }}