Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f58bb092e2 | ||
|
|
e891c7ef2e | ||
|
|
55d8778edf | ||
|
|
bd9cc97362 | ||
|
|
340b6d29bf | ||
|
|
af1b81038b | ||
|
|
4bff2f69e9 | ||
|
|
312b22a1a7 | ||
|
|
f9819533db | ||
|
|
fb8180fe09 | ||
|
|
68c1db497f | ||
|
|
a162554f4f |
No files matched your search
@@ -1,3 +1,6 @@
|
|||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
version: 2.1
|
version: 2.1
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -6,10 +9,6 @@ jobs:
|
|||||||
image: 'ubuntu-2004:202107-02'
|
image: 'ubuntu-2004:202107-02'
|
||||||
working_directory: ~/terraform-provider-watchtower
|
working_directory: ~/terraform-provider-watchtower
|
||||||
steps:
|
steps:
|
||||||
- add_ssh_keys:
|
|
||||||
fingerprints:
|
|
||||||
# hc-github-team-secure-boundary github user,TF_ACC=1 ~/.go/bin/go test ./... -v $(TESTARGS) -timeout 120m to read private modules
|
|
||||||
- "d4:7f:b2:f7:6f:4d:e7:21:cc:d2:b7:6a:8b:68:e6:d4"
|
|
||||||
- checkout
|
- checkout
|
||||||
- run:
|
- run:
|
||||||
name: "Install go"
|
name: "Install go"
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
schema_version = 1
|
||||||
|
|
||||||
|
project {
|
||||||
|
license = "MPL-2.0"
|
||||||
|
|
||||||
|
copyright_year = 2020
|
||||||
|
|
||||||
|
# (OPTIONAL) A list of globs that should not have copyright or license headers.
|
||||||
|
# Supports doublestar glob patterns for more flexibility in defining which
|
||||||
|
# files or folders should be ignored
|
||||||
|
# Default: []
|
||||||
|
header_ignore = [
|
||||||
|
"examples/**.tf",
|
||||||
|
"examples/**.sh",
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
# See GitHub's docs for more information on this file:
|
# See GitHub's docs for more information on this file:
|
||||||
# https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/configuration-options-for-dependency-updates
|
# https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
version: 2
|
version: 2
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.JIRA_SYNC_GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.JIRA_SYNC_GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Login
|
- name: Login
|
||||||
uses: atlassian/gajira-login@v2.0.0
|
uses: atlassian/gajira-login@v3.0.1
|
||||||
env:
|
env:
|
||||||
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
|
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }}
|
||||||
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
|
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }}
|
||||||
@@ -74,14 +74,14 @@ jobs:
|
|||||||
|
|
||||||
- name: Close ticket
|
- name: Close ticket
|
||||||
if: (github.event.action == 'closed' || github.event.action == 'deleted') && steps.search.outputs.issue
|
if: (github.event.action == 'closed' || github.event.action == 'deleted') && steps.search.outputs.issue
|
||||||
uses: atlassian/gajira-transition@v2.0.2
|
uses: atlassian/gajira-transition@v3.0.1
|
||||||
with:
|
with:
|
||||||
issue: ${{ steps.search.outputs.issue }}
|
issue: ${{ steps.search.outputs.issue }}
|
||||||
transition: Done
|
transition: Done
|
||||||
|
|
||||||
- name: Reopen ticket
|
- name: Reopen ticket
|
||||||
if: github.event.action == 'reopened' && steps.search.outputs.issue
|
if: github.event.action == 'reopened' && steps.search.outputs.issue
|
||||||
uses: atlassian/gajira-transition@v2.0.2
|
uses: atlassian/gajira-transition@v3.0.1
|
||||||
with:
|
with:
|
||||||
issue: ${{ steps.search.outputs.issue }}
|
issue: ${{ steps.search.outputs.issue }}
|
||||||
transition: "To Do"
|
transition: "To Do"
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
archives:
|
archives:
|
||||||
- files:
|
- files:
|
||||||
# Ensure only built binary is archived
|
# Ensure only built binary is archived
|
||||||
|
|||||||
@@ -1,2 +1,5 @@
|
|||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
url_source_repository = "https://github.com/hashicorp/terraform-provider-boundary"
|
url_source_repository = "https://github.com/hashicorp/terraform-provider-boundary"
|
||||||
url_license = "https://github.com/hashicorp/terraform-provider-boundary/blob/main/LICENSE"
|
url_license = "https://github.com/hashicorp/terraform-provider-boundary/blob/main/LICENSE"
|
||||||
@@ -2,6 +2,13 @@
|
|||||||
|
|
||||||
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.1.4 (February 15, 2023)
|
||||||
|
|
||||||
|
### New and Improved
|
||||||
|
* Add support for worker egress and ingress filters ([PR](https://github.com/hashicorp/terraform-provider-boundary/pull/319))
|
||||||
|
* Add support for vault ssh certificate credential libraries ([PR](https://github.com/hashicorp/terraform-provider-boundary/pull/320))
|
||||||
|
* Add support for targets with address configurations ([PR](https://github.com/hashicorp/terraform-provider-boundary/pull/308))
|
||||||
|
|
||||||
## 1.1.3 (November 29, 2022)
|
## 1.1.3 (November 29, 2022)
|
||||||
|
|
||||||
### New and Improved
|
### New and Improved
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
FROM golang:1.19
|
FROM golang:1.19
|
||||||
|
|
||||||
WORKDIR /go/src/terraform-provider-boundary
|
WORKDIR /go/src/terraform-provider-boundary
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
VERSION="1.19.1"
|
VERSION="1.19.1"
|
||||||
|
|||||||
@@ -0,0 +1,111 @@
|
|||||||
|
---
|
||||||
|
# generated by https://github.com/hashicorp/terraform-plugin-docs
|
||||||
|
page_title: "boundary_credential_library_vault_ssh_certificate Resource - terraform-provider-boundary"
|
||||||
|
subcategory: ""
|
||||||
|
description: |-
|
||||||
|
The credential library for Vault resource allows you to configure a Boundary credential library for Vault.
|
||||||
|
---
|
||||||
|
|
||||||
|
# boundary_credential_library_vault_ssh_certificate (Resource)
|
||||||
|
|
||||||
|
The credential library for Vault resource allows you to configure a Boundary credential library for Vault.
|
||||||
|
|
||||||
|
## Example Usage
|
||||||
|
|
||||||
|
```terraform
|
||||||
|
resource "boundary_scope" "org" {
|
||||||
|
name = "organization_one"
|
||||||
|
description = "My first 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_credential_store_vault" "foo" {
|
||||||
|
name = "foo"
|
||||||
|
description = "My first Vault credential store!"
|
||||||
|
address = "http://127.0.0.1:8200" # change to Vault address
|
||||||
|
token = "s.0ufRo6XEGU2jOqnIr7OlFYP5" # change to valid Vault token
|
||||||
|
scope_id = boundary_scope.project.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "foo" {
|
||||||
|
name = "foo"
|
||||||
|
description = "My first Vault SSH certificate credential library!"
|
||||||
|
credential_store_id = boundary_credential_store_vault.foo.id
|
||||||
|
path = "ssh/sign/foo" # change to correct Vault endpoint and role
|
||||||
|
username = "foo" # change to valid username
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "bar" {
|
||||||
|
name = "bar"
|
||||||
|
description = "My second Vault SSH certificate credential library!"
|
||||||
|
credential_store_id = boundary_credential_store_vault.foo.id
|
||||||
|
path = "ssh/sign/foo" # change to correct Vault endpoint and role
|
||||||
|
username = "foo"
|
||||||
|
key_type = "ecdsa"
|
||||||
|
key_bits = 384
|
||||||
|
|
||||||
|
extensions = {
|
||||||
|
permit-pty = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "baz" {
|
||||||
|
name = "baz"
|
||||||
|
description = "vault "
|
||||||
|
credential_store_id = boundary_credential_store_vault.foo.id
|
||||||
|
path = "ssh/issue/foo" # change to correct Vault endpoint and role
|
||||||
|
username = "foo"
|
||||||
|
key_type = "rsa"
|
||||||
|
key_bits = 4096
|
||||||
|
|
||||||
|
extensions = {
|
||||||
|
permit-pty = ""
|
||||||
|
permit-X11-forwarding = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
critical_options = {
|
||||||
|
force-command = "/bin/some_script"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- schema generated by tfplugindocs -->
|
||||||
|
## Schema
|
||||||
|
|
||||||
|
### Required
|
||||||
|
|
||||||
|
- `credential_store_id` (String) The ID of the credential store that this library belongs to.
|
||||||
|
- `path` (String) The path in Vault to request credentials from.
|
||||||
|
- `username` (String) The username to use with the certificate returned by the library.
|
||||||
|
|
||||||
|
### Optional
|
||||||
|
|
||||||
|
- `critical_options` (Map of String) Specifies a map of the critical options that the certificate should be signed for.
|
||||||
|
- `description` (String) The Vault credential library description.
|
||||||
|
- `extensions` (Map of String) Specifies a map of the extensions that the certificate should be signed for.
|
||||||
|
- `key_bits` (Number) Specifies the number of bits to use for the generated keys.
|
||||||
|
- `key_id` (String) Specifies the key id a certificate should have.
|
||||||
|
- `key_type` (String) Specifies the desired key type; must be ed25519, ecdsa, or rsa.
|
||||||
|
- `name` (String) The Vault credential library name. Defaults to the resource name.
|
||||||
|
- `ttl` (String) Specifies the requested time to live for a certificate returned from the library.
|
||||||
|
|
||||||
|
### Read-Only
|
||||||
|
|
||||||
|
- `id` (String) The ID of the Vault credential library.
|
||||||
|
|
||||||
|
## Import
|
||||||
|
|
||||||
|
Import is supported using the following syntax:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
terraform import boundary_credential_library_vault_ssh_certificate.foo <my-id>
|
||||||
|
```
|
||||||
@@ -111,6 +111,15 @@ resource "boundary_target" "ssh_foo" {
|
|||||||
boundary_credential_library_vault.foo.id
|
boundary_credential_library_vault.foo.id
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resource "boundary_target" "address_foo" {
|
||||||
|
name = "address_foo"
|
||||||
|
description = "Foo target with an address"
|
||||||
|
type = "tcp"
|
||||||
|
default_port = "22"
|
||||||
|
scope_id = boundary_scope.project.id
|
||||||
|
address = "127.0.0.1"
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
<!-- schema generated by tfplugindocs -->
|
<!-- schema generated by tfplugindocs -->
|
||||||
@@ -123,15 +132,18 @@ resource "boundary_target" "ssh_foo" {
|
|||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
|
- `address` (String) Optionally, a valid network address to connect to for this target. Cannot be used alongside host_source_ids.
|
||||||
- `brokered_credential_source_ids` (Set of String) A list of brokered credential source ID's.
|
- `brokered_credential_source_ids` (Set of String) A list of brokered credential source ID's.
|
||||||
- `default_port` (Number) The default port for this target.
|
- `default_port` (Number) The default port for this target.
|
||||||
- `description` (String) The target description.
|
- `description` (String) The target description.
|
||||||
- `host_source_ids` (Set of String) A list of host source ID's.
|
- `egress_worker_filter` (String) Boolean expression to filter the workers used to access this target
|
||||||
|
- `host_source_ids` (Set of String) A list of host source ID's. Cannot be used alongside address.
|
||||||
|
- `ingress_worker_filter` (String) HCP Only. Boolean expression to filter the workers a user will connect to when initiating a session against this target
|
||||||
- `injected_application_credential_source_ids` (Set of String) A list of injected application credential source ID's.
|
- `injected_application_credential_source_ids` (Set of String) A list of injected application credential source ID's.
|
||||||
- `name` (String) The target name. Defaults to the resource name.
|
- `name` (String) The target name. Defaults to the resource name.
|
||||||
- `session_connection_limit` (Number)
|
- `session_connection_limit` (Number)
|
||||||
- `session_max_seconds` (Number)
|
- `session_max_seconds` (Number)
|
||||||
- `worker_filter` (String) Boolean expression to filter the workers for this target
|
- `worker_filter` (String, Deprecated) Boolean expression to filter the workers for this target
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|
||||||
|
|||||||
@@ -15,14 +15,11 @@ The resource allows you to create a self-managed worker object.
|
|||||||
<!-- schema generated by tfplugindocs -->
|
<!-- schema generated by tfplugindocs -->
|
||||||
## Schema
|
## Schema
|
||||||
|
|
||||||
### Required
|
|
||||||
|
|
||||||
- `scope_id` (String) The scope for the worker.
|
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
- `description` (String) The description for the worker.
|
- `description` (String) The description for the worker.
|
||||||
- `name` (String) The name for the worker.
|
- `name` (String) The name for the worker.
|
||||||
|
- `scope_id` (String) The scope for the worker. Defaults to `global`.
|
||||||
- `worker_generated_auth_token` (String) The worker authentication token required to register the worker for the worker-led authentication flow. Leaving this blank will result in a controller generated token.
|
- `worker_generated_auth_token` (String) The worker authentication token required to register the worker for the worker-led authentication flow. Leaving this blank will result in a controller generated token.
|
||||||
|
|
||||||
### Read-Only
|
### Read-Only
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
terraform import boundary_credential_library_vault_ssh_certificate.foo <my-id>
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
resource "boundary_scope" "org" {
|
||||||
|
name = "organization_one"
|
||||||
|
description = "My first 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_credential_store_vault" "foo" {
|
||||||
|
name = "foo"
|
||||||
|
description = "My first Vault credential store!"
|
||||||
|
address = "http://127.0.0.1:8200" # change to Vault address
|
||||||
|
token = "s.0ufRo6XEGU2jOqnIr7OlFYP5" # change to valid Vault token
|
||||||
|
scope_id = boundary_scope.project.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "foo" {
|
||||||
|
name = "foo"
|
||||||
|
description = "My first Vault SSH certificate credential library!"
|
||||||
|
credential_store_id = boundary_credential_store_vault.foo.id
|
||||||
|
path = "ssh/sign/foo" # change to correct Vault endpoint and role
|
||||||
|
username = "foo" # change to valid username
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "bar" {
|
||||||
|
name = "bar"
|
||||||
|
description = "My second Vault SSH certificate credential library!"
|
||||||
|
credential_store_id = boundary_credential_store_vault.foo.id
|
||||||
|
path = "ssh/sign/foo" # change to correct Vault endpoint and role
|
||||||
|
username = "foo"
|
||||||
|
key_type = "ecdsa"
|
||||||
|
key_bits = 384
|
||||||
|
|
||||||
|
extensions = {
|
||||||
|
permit-pty = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "baz" {
|
||||||
|
name = "baz"
|
||||||
|
description = "vault "
|
||||||
|
credential_store_id = boundary_credential_store_vault.foo.id
|
||||||
|
path = "ssh/issue/foo" # change to correct Vault endpoint and role
|
||||||
|
username = "foo"
|
||||||
|
key_type = "rsa"
|
||||||
|
key_bits = 4096
|
||||||
|
|
||||||
|
extensions = {
|
||||||
|
permit-pty = ""
|
||||||
|
permit-X11-forwarding = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
critical_options = {
|
||||||
|
force-command = "/bin/some_script"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -96,3 +96,12 @@ resource "boundary_target" "ssh_foo" {
|
|||||||
boundary_credential_library_vault.foo.id
|
boundary_credential_library_vault.foo.id
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resource "boundary_target" "address_foo" {
|
||||||
|
name = "address_foo"
|
||||||
|
description = "Foo target with an address"
|
||||||
|
type = "tcp"
|
||||||
|
default_port = "22"
|
||||||
|
scope_id = boundary_scope.project.id
|
||||||
|
address = "127.0.0.1"
|
||||||
|
}
|
||||||
@@ -3,13 +3,13 @@ module github.com/hashicorp/terraform-provider-boundary
|
|||||||
go 1.19
|
go 1.19
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/hashicorp/boundary v0.11.1
|
github.com/hashicorp/boundary v0.12.0
|
||||||
github.com/hashicorp/boundary/api v0.0.32
|
github.com/hashicorp/boundary/api v0.0.34
|
||||||
github.com/hashicorp/boundary/sdk v0.0.26
|
github.com/hashicorp/boundary/sdk v0.0.30
|
||||||
github.com/hashicorp/cap v0.2.0
|
github.com/hashicorp/cap v0.2.0
|
||||||
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.6-0.20221122211539-47c893099f13
|
github.com/hashicorp/go-kms-wrapping/v2 v2.0.6-0.20221122211539-47c893099f13
|
||||||
github.com/hashicorp/go-secure-stdlib/configutil/v2 v2.0.5
|
github.com/hashicorp/go-secure-stdlib/configutil/v2 v2.0.7
|
||||||
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7
|
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7
|
||||||
github.com/hashicorp/go-secure-stdlib/pluginutil/v2 v2.0.3
|
github.com/hashicorp/go-secure-stdlib/pluginutil/v2 v2.0.3
|
||||||
github.com/hashicorp/terraform-plugin-docs v0.13.0
|
github.com/hashicorp/terraform-plugin-docs v0.13.0
|
||||||
@@ -37,7 +37,7 @@ require (
|
|||||||
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/v3 v3.0.0 // indirect
|
github.com/cenkalti/backoff/v3 v3.0.0 // indirect
|
||||||
github.com/cenkalti/backoff/v4 v4.1.0 // indirect
|
github.com/cenkalti/backoff/v4 v4.1.3 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||||
github.com/containerd/continuity v0.1.0 // indirect
|
github.com/containerd/continuity v0.1.0 // indirect
|
||||||
github.com/coreos/go-oidc/v3 v3.1.0 // indirect
|
github.com/coreos/go-oidc/v3 v3.1.0 // indirect
|
||||||
@@ -71,7 +71,7 @@ require (
|
|||||||
github.com/hashicorp/go-hclog v1.2.2 // indirect
|
github.com/hashicorp/go-hclog v1.2.2 // indirect
|
||||||
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
|
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
|
||||||
github.com/hashicorp/go-kms-wrapping/extras/kms/v2 v2.0.0-20221122211539-47c893099f13 // indirect
|
github.com/hashicorp/go-kms-wrapping/extras/kms/v2 v2.0.0-20221122211539-47c893099f13 // indirect
|
||||||
github.com/hashicorp/go-kms-wrapping/plugin/v2 v2.0.2 // indirect
|
github.com/hashicorp/go-kms-wrapping/plugin/v2 v2.0.3 // 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.4.6 // indirect
|
github.com/hashicorp/go-plugin v1.4.6 // indirect
|
||||||
github.com/hashicorp/go-retryablehttp v0.7.0 // indirect
|
github.com/hashicorp/go-retryablehttp v0.7.0 // indirect
|
||||||
@@ -79,7 +79,7 @@ require (
|
|||||||
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
|
||||||
github.com/hashicorp/go-secure-stdlib/kv-builder v0.1.1 // indirect
|
github.com/hashicorp/go-secure-stdlib/kv-builder v0.1.1 // indirect
|
||||||
github.com/hashicorp/go-secure-stdlib/listenerutil v0.1.4 // indirect
|
github.com/hashicorp/go-secure-stdlib/listenerutil v0.1.5-0.20221130175209-f7789ac19a1f // indirect
|
||||||
github.com/hashicorp/go-secure-stdlib/mlock v0.1.1 // indirect
|
github.com/hashicorp/go-secure-stdlib/mlock v0.1.1 // indirect
|
||||||
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
|
||||||
@@ -92,7 +92,7 @@ require (
|
|||||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
github.com/hashicorp/hcl/v2 v2.15.0 // indirect
|
github.com/hashicorp/hcl/v2 v2.15.0 // indirect
|
||||||
github.com/hashicorp/logutils v1.0.0 // indirect
|
github.com/hashicorp/logutils v1.0.0 // indirect
|
||||||
github.com/hashicorp/nodeenrollment v0.1.17 // indirect
|
github.com/hashicorp/nodeenrollment v0.1.18 // indirect
|
||||||
github.com/hashicorp/terraform-exec v0.17.3 // indirect
|
github.com/hashicorp/terraform-exec v0.17.3 // indirect
|
||||||
github.com/hashicorp/terraform-json v0.14.0 // indirect
|
github.com/hashicorp/terraform-json v0.14.0 // indirect
|
||||||
github.com/hashicorp/terraform-plugin-go v0.14.1 // indirect
|
github.com/hashicorp/terraform-plugin-go v0.14.1 // indirect
|
||||||
@@ -101,7 +101,7 @@ require (
|
|||||||
github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect
|
github.com/hashicorp/terraform-svchost v0.0.0-20200729002733-f050f53b9734 // indirect
|
||||||
github.com/hashicorp/vault/api v1.3.1 // indirect
|
github.com/hashicorp/vault/api v1.3.1 // indirect
|
||||||
github.com/hashicorp/vault/sdk v0.3.0 // indirect
|
github.com/hashicorp/vault/sdk v0.3.0 // indirect
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect
|
github.com/hashicorp/yamux v0.1.0 // indirect
|
||||||
github.com/huandu/xstrings v1.3.2 // indirect
|
github.com/huandu/xstrings v1.3.2 // indirect
|
||||||
github.com/imdario/mergo v0.3.13 // indirect
|
github.com/imdario/mergo v0.3.13 // indirect
|
||||||
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
|
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
|
||||||
@@ -124,6 +124,7 @@ require (
|
|||||||
github.com/mattn/go-isatty v0.0.14 // indirect
|
github.com/mattn/go-isatty v0.0.14 // 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.2-0.20181231171920-c182affec369 // indirect
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
|
||||||
|
github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a // indirect
|
||||||
github.com/mitchellh/cli v1.1.4 // indirect
|
github.com/mitchellh/cli v1.1.4 // indirect
|
||||||
github.com/mitchellh/copystructure v1.2.0 // indirect
|
github.com/mitchellh/copystructure v1.2.0 // indirect
|
||||||
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
|
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
|
||||||
@@ -168,7 +169,7 @@ require (
|
|||||||
golang.org/x/exp v0.0.0-20220921164117-439092de6870 // indirect
|
golang.org/x/exp v0.0.0-20220921164117-439092de6870 // indirect
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
|
||||||
golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c // indirect
|
golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c // indirect
|
||||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 // indirect
|
golang.org/x/sys v0.2.0 // indirect
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
|
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
|
||||||
|
|||||||
@@ -192,8 +192,9 @@ github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3k
|
|||||||
github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c=
|
github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c=
|
||||||
github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
|
github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
|
||||||
github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
|
github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg=
|
||||||
github.com/cenkalti/backoff/v4 v4.1.0 h1:c8LkOFQTzuO0WBM/ae5HdGQuZPfPxp7lqBRwQRm4fSc=
|
|
||||||
github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
|
||||||
|
github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
@@ -631,12 +632,12 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb
|
|||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.2 h1:BqHID5W5qnMkug0Z8UmL8tN0gAy4jQ+B4WFt8cCgluU=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.2 h1:BqHID5W5qnMkug0Z8UmL8tN0gAy4jQ+B4WFt8cCgluU=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.2/go.mod h1:ZbS3MZTZq/apAfAEHGoB5HbsQQstoqP92SjAqtQ9zeg=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.2/go.mod h1:ZbS3MZTZq/apAfAEHGoB5HbsQQstoqP92SjAqtQ9zeg=
|
||||||
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
|
||||||
github.com/hashicorp/boundary v0.11.1 h1:uv6tJDeO3/tLSs/KusCBtpaN5788HaAgLWSQkdJWgVw=
|
github.com/hashicorp/boundary v0.12.0 h1:GRghJrzD82AQsfRPYHq2LbKTzV+s35K2L71dMIVHwug=
|
||||||
github.com/hashicorp/boundary v0.11.1/go.mod h1:P/dLuatZTHoXDVABg4kqIreX+sspe3ww+QdTgpYRuwo=
|
github.com/hashicorp/boundary v0.12.0/go.mod h1:A7x+oV7sX7OSxTexUgJBVQO27UaqL4F8eVRvnV9gDu4=
|
||||||
github.com/hashicorp/boundary/api v0.0.32 h1:vgz8rCkqCgXYX65646WXf+Mu+jiXOw766woOwUGY2Bs=
|
github.com/hashicorp/boundary/api v0.0.34 h1:A5G6XtJu6eG8A0sB5alS1fr9Z0jZHZBIqJRF8E5nnI4=
|
||||||
github.com/hashicorp/boundary/api v0.0.32/go.mod h1:yroNrsyCVCSEKnrbyDeyS2iO0aMq7BTYtAptZWgIb60=
|
github.com/hashicorp/boundary/api v0.0.34/go.mod h1:yroNrsyCVCSEKnrbyDeyS2iO0aMq7BTYtAptZWgIb60=
|
||||||
github.com/hashicorp/boundary/sdk v0.0.26 h1:8L1sZnpVcWB2b8IrSAVuDTP+WEOt63pYlBvRi2Q8pWA=
|
github.com/hashicorp/boundary/sdk v0.0.30 h1:+EOjA2Xb51Y7c0fG8lw0lmwpl2ZC3b+1M8nJIh6HlVg=
|
||||||
github.com/hashicorp/boundary/sdk v0.0.26/go.mod h1:rriE6QxdGmK8zDenGdeKDcZewVl8tzUdXOYTBf8uj+Y=
|
github.com/hashicorp/boundary/sdk v0.0.30/go.mod h1:q5eFsoCnYMgnX+smkbkOOzqjVWIUupWNMKIa53SQLZA=
|
||||||
github.com/hashicorp/cap v0.2.0 h1:Cgr1iDczX17y0PNF5VG+bWTtDiimYL8F18izMPbWNy4=
|
github.com/hashicorp/cap v0.2.0 h1:Cgr1iDczX17y0PNF5VG+bWTtDiimYL8F18izMPbWNy4=
|
||||||
github.com/hashicorp/cap v0.2.0/go.mod h1:zb3VvIFA0lM2lbmO69NjowV9dJzJnZS89TaM9blXPJA=
|
github.com/hashicorp/cap v0.2.0/go.mod h1:zb3VvIFA0lM2lbmO69NjowV9dJzJnZS89TaM9blXPJA=
|
||||||
github.com/hashicorp/dbassert v0.0.0-20210708202608-ecf920cf1ed8 h1:/3iubtqEdLgdXB6ue+WAKvbcpn313jjL5mQvU5ByymE=
|
github.com/hashicorp/dbassert v0.0.0-20210708202608-ecf920cf1ed8 h1:/3iubtqEdLgdXB6ue+WAKvbcpn313jjL5mQvU5ByymE=
|
||||||
@@ -675,8 +676,8 @@ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh
|
|||||||
github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g=
|
github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g=
|
||||||
github.com/hashicorp/go-kms-wrapping/extras/kms/v2 v2.0.0-20221122211539-47c893099f13 h1:486QccSsJAKonkWSZmBn5GWzZCW3UV3OwMoOGUXJBO4=
|
github.com/hashicorp/go-kms-wrapping/extras/kms/v2 v2.0.0-20221122211539-47c893099f13 h1:486QccSsJAKonkWSZmBn5GWzZCW3UV3OwMoOGUXJBO4=
|
||||||
github.com/hashicorp/go-kms-wrapping/extras/kms/v2 v2.0.0-20221122211539-47c893099f13/go.mod h1:qbLdiZhFd182vRSOlhBV/OarUcJVTOF2WklPwHs8mYQ=
|
github.com/hashicorp/go-kms-wrapping/extras/kms/v2 v2.0.0-20221122211539-47c893099f13/go.mod h1:qbLdiZhFd182vRSOlhBV/OarUcJVTOF2WklPwHs8mYQ=
|
||||||
github.com/hashicorp/go-kms-wrapping/plugin/v2 v2.0.2 h1:it114Kjpk79JVh6AfxFMP5oi1gb+RPzcSLiG3zF/J0w=
|
github.com/hashicorp/go-kms-wrapping/plugin/v2 v2.0.3 h1:RcEyqlOdRXgiTF8pXXbYim1ga7qiWvCEcB+DNsGnxAA=
|
||||||
github.com/hashicorp/go-kms-wrapping/plugin/v2 v2.0.2/go.mod h1:b9mq0bG5xJ10ZcTEQJLZ22O9y71hIt2MGTLqROA/SAM=
|
github.com/hashicorp/go-kms-wrapping/plugin/v2 v2.0.3/go.mod h1:e/xXrQ8uKG1GEEseVg6l0XKVaOtYggl75MPd6osZQ0I=
|
||||||
github.com/hashicorp/go-kms-wrapping/v2 v2.0.6-0.20221122211539-47c893099f13 h1:4YewFQjQJNAzXtahRax77IFi0emoYvPZGESfi+KCpGg=
|
github.com/hashicorp/go-kms-wrapping/v2 v2.0.6-0.20221122211539-47c893099f13 h1:4YewFQjQJNAzXtahRax77IFi0emoYvPZGESfi+KCpGg=
|
||||||
github.com/hashicorp/go-kms-wrapping/v2 v2.0.6-0.20221122211539-47c893099f13/go.mod h1:sDQAfwJGv25uGPZA04x87ERglCG6avnRcBT9wYoMII8=
|
github.com/hashicorp/go-kms-wrapping/v2 v2.0.6-0.20221122211539-47c893099f13/go.mod h1:sDQAfwJGv25uGPZA04x87ERglCG6avnRcBT9wYoMII8=
|
||||||
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
|
||||||
@@ -697,14 +698,14 @@ github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR3
|
|||||||
github.com/hashicorp/go-secure-stdlib/base62 v0.1.1/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw=
|
github.com/hashicorp/go-secure-stdlib/base62 v0.1.1/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw=
|
||||||
github.com/hashicorp/go-secure-stdlib/base62 v0.1.2 h1:ET4pqyjiGmY09R5y+rSd70J2w45CtbWDNvGqWp/R3Ng=
|
github.com/hashicorp/go-secure-stdlib/base62 v0.1.2 h1:ET4pqyjiGmY09R5y+rSd70J2w45CtbWDNvGqWp/R3Ng=
|
||||||
github.com/hashicorp/go-secure-stdlib/base62 v0.1.2/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw=
|
github.com/hashicorp/go-secure-stdlib/base62 v0.1.2/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw=
|
||||||
github.com/hashicorp/go-secure-stdlib/configutil/v2 v2.0.5 h1:o1rvQfjcXq9XYaeU9xqrI0wGtxNdAm3cEtt6G6/tiHw=
|
github.com/hashicorp/go-secure-stdlib/configutil/v2 v2.0.7 h1:b1VFIL6LpAh7iVCoQdoZtXAHqfAClpGsESfZULhfGm0=
|
||||||
github.com/hashicorp/go-secure-stdlib/configutil/v2 v2.0.5/go.mod h1:xhbcgyAifqiPhd37Acws2dEBPc7Kel77GexmIKW+Ehw=
|
github.com/hashicorp/go-secure-stdlib/configutil/v2 v2.0.7/go.mod h1:3SpPba0gPDe21iawzV368GMEKJyG+MU7NgFwjW33w5o=
|
||||||
github.com/hashicorp/go-secure-stdlib/gatedwriter v0.1.1 h1:9um9R8i0+HbRHS9d64kdvWR0/LJvo12sIonvR9zr1+U=
|
github.com/hashicorp/go-secure-stdlib/gatedwriter v0.1.1 h1:9um9R8i0+HbRHS9d64kdvWR0/LJvo12sIonvR9zr1+U=
|
||||||
github.com/hashicorp/go-secure-stdlib/gatedwriter v0.1.1/go.mod h1:6RoRTSMDK2H/rKh3P/JIsk1tK8aatKTt3JyvIopi3GQ=
|
github.com/hashicorp/go-secure-stdlib/gatedwriter v0.1.1/go.mod h1:6RoRTSMDK2H/rKh3P/JIsk1tK8aatKTt3JyvIopi3GQ=
|
||||||
github.com/hashicorp/go-secure-stdlib/kv-builder v0.1.1 h1:IJgULbAXuvWxzKFfu+Au1FUmHIJulS6N4F7Hkn+Kck0=
|
github.com/hashicorp/go-secure-stdlib/kv-builder v0.1.1 h1:IJgULbAXuvWxzKFfu+Au1FUmHIJulS6N4F7Hkn+Kck0=
|
||||||
github.com/hashicorp/go-secure-stdlib/kv-builder v0.1.1/go.mod h1:rf5JPE13wi+NwjgsmGkbg4b2CgHq8v7Htn/F0nDe/hg=
|
github.com/hashicorp/go-secure-stdlib/kv-builder v0.1.1/go.mod h1:rf5JPE13wi+NwjgsmGkbg4b2CgHq8v7Htn/F0nDe/hg=
|
||||||
github.com/hashicorp/go-secure-stdlib/listenerutil v0.1.4 h1:6ajbq64FhrIJZ6prrff3upVVDil4yfCrnSKwTH0HIPE=
|
github.com/hashicorp/go-secure-stdlib/listenerutil v0.1.5-0.20221130175209-f7789ac19a1f h1:FemjU7MTEVt5HVI59M1AQjzEaR8mvlXr5I985BUbLSg=
|
||||||
github.com/hashicorp/go-secure-stdlib/listenerutil v0.1.4/go.mod h1:myX7XYMJRIP4PLHtYJiKMTJcKOX0M5ZJNwP0iw+l3uw=
|
github.com/hashicorp/go-secure-stdlib/listenerutil v0.1.5-0.20221130175209-f7789ac19a1f/go.mod h1:MSXg3Md+eg1hOJFSKuTELy6YnFhfMJBVYu7t07BdPc4=
|
||||||
github.com/hashicorp/go-secure-stdlib/mlock v0.1.1 h1:cCRo8gK7oq6A2L6LICkUZ+/a5rLiRXFMf1Qd4xSwxTc=
|
github.com/hashicorp/go-secure-stdlib/mlock v0.1.1 h1:cCRo8gK7oq6A2L6LICkUZ+/a5rLiRXFMf1Qd4xSwxTc=
|
||||||
github.com/hashicorp/go-secure-stdlib/mlock v0.1.1/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I=
|
github.com/hashicorp/go-secure-stdlib/mlock v0.1.1/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I=
|
||||||
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8=
|
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.1/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8=
|
||||||
@@ -744,8 +745,8 @@ github.com/hashicorp/hcl/v2 v2.15.0 h1:CPDXO6+uORPjKflkWCCwoWc9uRp+zSIPcCQ+BrxV7
|
|||||||
github.com/hashicorp/hcl/v2 v2.15.0/go.mod h1:JRmR89jycNkrrqnMmvPDMd56n1rQJ2Q6KocSLCMCXng=
|
github.com/hashicorp/hcl/v2 v2.15.0/go.mod h1:JRmR89jycNkrrqnMmvPDMd56n1rQJ2Q6KocSLCMCXng=
|
||||||
github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
|
github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
|
||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||||
github.com/hashicorp/nodeenrollment v0.1.17 h1:ZaGNugd3EOZIdJxgC5bUA1CbHZ/OKZcgXnquzoFql6E=
|
github.com/hashicorp/nodeenrollment v0.1.18 h1:fqFMZ5e2cWupeQDxKledF9DGHsk9GoJl7K2Wrdiys6k=
|
||||||
github.com/hashicorp/nodeenrollment v0.1.17/go.mod h1:N5gYsm8mWiDfIw/j+1IQ6NBO1cWCmhPpvQ9GB1QUnsU=
|
github.com/hashicorp/nodeenrollment v0.1.18/go.mod h1:N5gYsm8mWiDfIw/j+1IQ6NBO1cWCmhPpvQ9GB1QUnsU=
|
||||||
github.com/hashicorp/terraform-exec v0.17.3 h1:MX14Kvnka/oWGmIkyuyvL6POx25ZmKrjlaclkx3eErU=
|
github.com/hashicorp/terraform-exec v0.17.3 h1:MX14Kvnka/oWGmIkyuyvL6POx25ZmKrjlaclkx3eErU=
|
||||||
github.com/hashicorp/terraform-exec v0.17.3/go.mod h1:+NELG0EqQekJzhvikkeQsOAZpsw0cv/03rbeQJqscAI=
|
github.com/hashicorp/terraform-exec v0.17.3/go.mod h1:+NELG0EqQekJzhvikkeQsOAZpsw0cv/03rbeQJqscAI=
|
||||||
github.com/hashicorp/terraform-json v0.14.0 h1:sh9iZ1Y8IFJLx+xQiKHGud6/TSUCM0N8e17dKDpqV7s=
|
github.com/hashicorp/terraform-json v0.14.0 h1:sh9iZ1Y8IFJLx+xQiKHGud6/TSUCM0N8e17dKDpqV7s=
|
||||||
@@ -768,8 +769,9 @@ github.com/hashicorp/vault/sdk v0.1.13/go.mod h1:B+hVj7TpuQY1Y/GPbCpffmgd+tSEwvh
|
|||||||
github.com/hashicorp/vault/sdk v0.3.0 h1:kR3dpxNkhh/wr6ycaJYqp6AFT/i2xaftbfnwZduTKEY=
|
github.com/hashicorp/vault/sdk v0.3.0 h1:kR3dpxNkhh/wr6ycaJYqp6AFT/i2xaftbfnwZduTKEY=
|
||||||
github.com/hashicorp/vault/sdk v0.3.0/go.mod h1:aZ3fNuL5VNydQk8GcLJ2TV8YCRVvyaakYkhZRoVuhj0=
|
github.com/hashicorp/vault/sdk v0.3.0/go.mod h1:aZ3fNuL5VNydQk8GcLJ2TV8YCRVvyaakYkhZRoVuhj0=
|
||||||
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ=
|
|
||||||
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
|
||||||
|
github.com/hashicorp/yamux v0.1.0 h1:DzDIF6Sd7GD2sX0kDFpHAsJMY4L+OfTvtuaQsOYXxzk=
|
||||||
|
github.com/hashicorp/yamux v0.1.0/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
|
||||||
github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
|
github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
|
||||||
@@ -987,6 +989,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5
|
|||||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
|
||||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
|
||||||
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
|
||||||
|
github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a h1:eU8j/ClY2Ty3qdHnn0TyW3ivFoPC/0F1gQZz8yTxbbE=
|
||||||
|
github.com/mikesmitty/edkey v0.0.0-20170222072505-3356ea4e686a/go.mod h1:v8eSC2SMp9/7FTKUncp7fH9IwPfw+ysMObcEz5FWheQ=
|
||||||
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
|
||||||
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
|
||||||
github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4=
|
github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4=
|
||||||
@@ -1587,7 +1591,6 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@@ -1635,8 +1638,8 @@ golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBc
|
|||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg=
|
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
|
||||||
golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
// Helpers for dealing with file paths and their contents
|
// Helpers for dealing with file paths and their contents
|
||||||
//
|
//
|
||||||
// Originally from Terraform; see
|
// Originally from Terraform; see
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -68,33 +71,34 @@ func New() *schema.Provider {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
ResourcesMap: map[string]*schema.Resource{
|
ResourcesMap: map[string]*schema.Resource{
|
||||||
"boundary_account": resourceAccount(),
|
"boundary_account": resourceAccount(),
|
||||||
"boundary_account_password": resourceAccountPassword(),
|
"boundary_account_password": resourceAccountPassword(),
|
||||||
"boundary_account_oidc": resourceAccountOidc(),
|
"boundary_account_oidc": resourceAccountOidc(),
|
||||||
"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(),
|
||||||
"boundary_credential_library_vault": resourceCredentialLibraryVault(),
|
"boundary_credential_library_vault": resourceCredentialLibraryVault(),
|
||||||
"boundary_credential_store_vault": resourceCredentialStoreVault(),
|
"boundary_credential_library_vault_ssh_certificate": resourceCredentialLibraryVaultSshCertificate(),
|
||||||
"boundary_credential_store_static": resourceCredentialStoreStatic(),
|
"boundary_credential_store_vault": resourceCredentialStoreVault(),
|
||||||
"boundary_credential_username_password": resourceCredentialUsernamePassword(),
|
"boundary_credential_store_static": resourceCredentialStoreStatic(),
|
||||||
"boundary_credential_ssh_private_key": resourceCredentialSshPrivateKey(),
|
"boundary_credential_username_password": resourceCredentialUsernamePassword(),
|
||||||
"boundary_credential_json": resourceCredentialJson(),
|
"boundary_credential_ssh_private_key": resourceCredentialSshPrivateKey(),
|
||||||
"boundary_managed_group": resourceManagedGroup(),
|
"boundary_credential_json": resourceCredentialJson(),
|
||||||
"boundary_group": resourceGroup(),
|
"boundary_managed_group": resourceManagedGroup(),
|
||||||
"boundary_host": resourceHost(),
|
"boundary_group": resourceGroup(),
|
||||||
"boundary_host_static": resourceHostStatic(),
|
"boundary_host": resourceHost(),
|
||||||
"boundary_host_catalog": resourceHostCatalog(),
|
"boundary_host_static": resourceHostStatic(),
|
||||||
"boundary_host_catalog_static": resourceHostCatalogStatic(),
|
"boundary_host_catalog": resourceHostCatalog(),
|
||||||
"boundary_host_catalog_plugin": resourceHostCatalogPlugin(),
|
"boundary_host_catalog_static": resourceHostCatalogStatic(),
|
||||||
"boundary_host_set": resourceHostSet(),
|
"boundary_host_catalog_plugin": resourceHostCatalogPlugin(),
|
||||||
"boundary_host_set_static": resourceHostSetStatic(),
|
"boundary_host_set": resourceHostSet(),
|
||||||
"boundary_host_set_plugin": resourceHostSetPlugin(),
|
"boundary_host_set_static": resourceHostSetStatic(),
|
||||||
"boundary_role": resourceRole(),
|
"boundary_host_set_plugin": resourceHostSetPlugin(),
|
||||||
"boundary_scope": resourceScope(),
|
"boundary_role": resourceRole(),
|
||||||
"boundary_target": resourceTarget(),
|
"boundary_scope": resourceScope(),
|
||||||
"boundary_user": resourceUser(),
|
"boundary_target": resourceTarget(),
|
||||||
"boundary_worker": resourceWorker(),
|
"boundary_user": resourceUser(),
|
||||||
|
"boundary_worker": resourceWorker(),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -12,6 +15,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
credentialStoreIdKey = "credential_store_id"
|
credentialStoreIdKey = "credential_store_id"
|
||||||
|
credentialLibraryVaultType = "vault-generic"
|
||||||
credentialLibraryVaultHttpMethodKey = "http_method"
|
credentialLibraryVaultHttpMethodKey = "http_method"
|
||||||
credentialLibraryVaultHttpRequestBodyKey = "http_request_body"
|
credentialLibraryVaultHttpRequestBodyKey = "http_request_body"
|
||||||
credentialLibraryVaultPathKey = "path"
|
credentialLibraryVaultPathKey = "path"
|
||||||
@@ -153,7 +157,7 @@ func resourceCredentialLibraryCreateVault(ctx context.Context, d *schema.Resourc
|
|||||||
}
|
}
|
||||||
|
|
||||||
client := credentiallibraries.NewClient(md.client)
|
client := credentiallibraries.NewClient(md.client)
|
||||||
cr, err := client.Create(ctx, credentialStoreId, opts...)
|
cr, err := client.Create(ctx, credentialLibraryVaultType, credentialStoreId, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return diag.Errorf("error creating credential library: %v", err)
|
return diag.Errorf("error creating credential library: %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,404 @@
|
|||||||
|
// 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/credentiallibraries"
|
||||||
|
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
|
||||||
|
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
credentialLibraryVaultSshCertificateType = "vault-ssh-certificate"
|
||||||
|
credentialLibraryVaultSshCertificatePathKey = "path"
|
||||||
|
credentialLibraryVaultSshCertificateUsernameKey = "username"
|
||||||
|
credentialLibraryVaultSshCertificateKeyTypeKey = "key_type"
|
||||||
|
credentialLibraryVaultSshCertificateKeyBitsKey = "key_bits"
|
||||||
|
credentialLibraryVaultSshCertificateTtlKey = "ttl"
|
||||||
|
credentialLibraryVaultSshCertificateKeyIdKey = "key_id"
|
||||||
|
credentialLibraryVaultSshCertificateCriticalOptionsKey = "critical_options"
|
||||||
|
credentialLibraryVaultSshCertificateExtensionsKey = "extensions"
|
||||||
|
)
|
||||||
|
|
||||||
|
var libraryVaultSshCertificateAttrs = []string{
|
||||||
|
credentialLibraryVaultSshCertificatePathKey,
|
||||||
|
credentialLibraryVaultSshCertificateUsernameKey,
|
||||||
|
credentialLibraryVaultSshCertificateKeyTypeKey,
|
||||||
|
credentialLibraryVaultSshCertificateKeyBitsKey,
|
||||||
|
credentialLibraryVaultSshCertificateTtlKey,
|
||||||
|
credentialLibraryVaultSshCertificateKeyIdKey,
|
||||||
|
credentialLibraryVaultSshCertificateCriticalOptionsKey,
|
||||||
|
credentialLibraryVaultSshCertificateExtensionsKey,
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceCredentialLibraryVaultSshCertificate() *schema.Resource {
|
||||||
|
return &schema.Resource{
|
||||||
|
Description: "The credential library for Vault resource allows you to configure a Boundary credential library for Vault.",
|
||||||
|
|
||||||
|
CreateContext: resourceCredentialLibraryCreateVaultSshCertificate,
|
||||||
|
ReadContext: resourceCredentialLibraryReadVaultSshCertificate,
|
||||||
|
UpdateContext: resourceCredentialLibraryUpdateVaultSshCertificate,
|
||||||
|
DeleteContext: resourceCredentialLibraryDeleteVaultSshCertificate,
|
||||||
|
Importer: &schema.ResourceImporter{
|
||||||
|
StateContext: schema.ImportStatePassthroughContext,
|
||||||
|
},
|
||||||
|
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
IDKey: {
|
||||||
|
Description: "The ID of the Vault credential library.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
|
NameKey: {
|
||||||
|
Description: "The Vault credential library name. Defaults to the resource name.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
DescriptionKey: {
|
||||||
|
Description: "The Vault credential library description.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
credentialStoreIdKey: {
|
||||||
|
Description: "The ID of the credential store that this library belongs to.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
ForceNew: true,
|
||||||
|
},
|
||||||
|
credentialLibraryVaultSshCertificatePathKey: {
|
||||||
|
Description: "The path in Vault to request credentials from.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
credentialLibraryVaultSshCertificateUsernameKey: {
|
||||||
|
Description: "The username to use with the certificate returned by the library.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
credentialLibraryVaultSshCertificateKeyTypeKey: {
|
||||||
|
Description: "Specifies the desired key type; must be ed25519, ecdsa, or rsa.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
credentialLibraryVaultSshCertificateKeyBitsKey: {
|
||||||
|
Description: "Specifies the number of bits to use for the generated keys.",
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
credentialLibraryVaultSshCertificateTtlKey: {
|
||||||
|
Description: "Specifies the requested time to live for a certificate returned from the library.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
credentialLibraryVaultSshCertificateKeyIdKey: {
|
||||||
|
Description: "Specifies the key id a certificate should have.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
credentialLibraryVaultSshCertificateCriticalOptionsKey: {
|
||||||
|
Description: "Specifies a map of the critical options that the certificate should be signed for.",
|
||||||
|
Type: schema.TypeMap,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
credentialLibraryVaultSshCertificateExtensionsKey: {
|
||||||
|
Description: "Specifies a map of the extensions that the certificate should be signed for.",
|
||||||
|
Type: schema.TypeMap,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setFromVaultSshCertificateCredentialLibraryResponseMap(d *schema.ResourceData, raw map[string]interface{}) error {
|
||||||
|
if err := d.Set(NameKey, raw[NameKey]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := d.Set(DescriptionKey, raw[DescriptionKey]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := d.Set(credentialStoreIdKey, raw[credentialStoreIdKey]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if attrsVal, ok := raw["attributes"]; ok {
|
||||||
|
attrs := attrsVal.(map[string]interface{})
|
||||||
|
for _, v := range libraryVaultSshCertificateAttrs {
|
||||||
|
if err := d.Set(v, attrs[v]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
d.SetId(raw["id"].(string))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceCredentialLibraryCreateVaultSshCertificate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
|
||||||
|
md := meta.(*metaData)
|
||||||
|
|
||||||
|
var opts []credentiallibraries.Option
|
||||||
|
if v, ok := d.GetOk(NameKey); ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithName(v.(string)))
|
||||||
|
}
|
||||||
|
if v, ok := d.GetOk(DescriptionKey); ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithDescription(v.(string)))
|
||||||
|
}
|
||||||
|
if v, ok := d.GetOk(credentialLibraryVaultSshCertificatePathKey); ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultCredentialLibraryPath(v.(string)))
|
||||||
|
}
|
||||||
|
if v, ok := d.GetOk(credentialLibraryVaultSshCertificateUsernameKey); ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryUsername(v.(string)))
|
||||||
|
}
|
||||||
|
if v, ok := d.GetOk(credentialLibraryVaultSshCertificateKeyTypeKey); ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryKeyType(v.(string)))
|
||||||
|
}
|
||||||
|
if v, ok := d.GetOk(credentialLibraryVaultSshCertificateKeyBitsKey); ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryKeyBits(uint32(v.(int))))
|
||||||
|
}
|
||||||
|
if v, ok := d.GetOk(credentialLibraryVaultSshCertificateTtlKey); ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryTtl(v.(string)))
|
||||||
|
}
|
||||||
|
if v, ok := d.GetOk(credentialLibraryVaultSshCertificateKeyIdKey); ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryKeyId(v.(string)))
|
||||||
|
}
|
||||||
|
if v, ok := d.GetOk(credentialLibraryVaultSshCertificateCriticalOptionsKey); ok {
|
||||||
|
if vv, ok := v.(map[string]any); ok {
|
||||||
|
co := make(map[string]string, len(vv))
|
||||||
|
for k, vvv := range vv {
|
||||||
|
co[k] = vvv.(string)
|
||||||
|
}
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryCriticalOptions(co))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if v, ok := d.GetOk(credentialLibraryVaultSshCertificateExtensionsKey); ok {
|
||||||
|
if vv, ok := v.(map[string]any); ok {
|
||||||
|
e := make(map[string]string, len(vv))
|
||||||
|
for k, vvv := range vv {
|
||||||
|
e[k] = vvv.(string)
|
||||||
|
}
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryExtensions(e))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var credentialStoreId string
|
||||||
|
cid, ok := d.GetOk(credentialStoreIdKey)
|
||||||
|
if ok {
|
||||||
|
credentialStoreId = cid.(string)
|
||||||
|
} else {
|
||||||
|
return diag.Errorf("no credential store ID is set")
|
||||||
|
}
|
||||||
|
|
||||||
|
client := credentiallibraries.NewClient(md.client)
|
||||||
|
cr, err := client.Create(ctx, credentialLibraryVaultSshCertificateType, credentialStoreId, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return diag.Errorf("error creating credential library: %v", err)
|
||||||
|
}
|
||||||
|
if cr == nil {
|
||||||
|
return diag.Errorf("nil credential library after create")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := setFromVaultSshCertificateCredentialLibraryResponseMap(d, cr.GetResponse().Map); err != nil {
|
||||||
|
return diag.FromErr(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceCredentialLibraryReadVaultSshCertificate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
|
||||||
|
md := meta.(*metaData)
|
||||||
|
client := credentiallibraries.NewClient(md.client)
|
||||||
|
|
||||||
|
cr, err := client.Read(ctx, d.Id())
|
||||||
|
if err != nil {
|
||||||
|
if apiErr := api.AsServerError(err); apiErr != nil && apiErr.Response().StatusCode() == http.StatusNotFound {
|
||||||
|
d.SetId("")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return diag.Errorf("error reading credential library: %v", err)
|
||||||
|
}
|
||||||
|
if cr == nil {
|
||||||
|
return diag.Errorf("credential library nil after read")
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := setFromVaultSshCertificateCredentialLibraryResponseMap(d, cr.GetResponse().Map); err != nil {
|
||||||
|
return diag.FromErr(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceCredentialLibraryUpdateVaultSshCertificate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
|
||||||
|
md := meta.(*metaData)
|
||||||
|
client := credentiallibraries.NewClient(md.client)
|
||||||
|
|
||||||
|
var opts []credentiallibraries.Option
|
||||||
|
if d.HasChange(NameKey) {
|
||||||
|
opts = append(opts, credentiallibraries.DefaultName())
|
||||||
|
nameVal, ok := d.GetOk(NameKey)
|
||||||
|
if ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithName(nameVal.(string)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(DescriptionKey) {
|
||||||
|
opts = append(opts, credentiallibraries.DefaultDescription())
|
||||||
|
descVal, ok := d.GetOk(DescriptionKey)
|
||||||
|
if ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithDescription(descVal.(string)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(credentialLibraryVaultSshCertificatePathKey) {
|
||||||
|
v, ok := d.GetOk(credentialLibraryVaultSshCertificatePathKey)
|
||||||
|
if ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultCredentialLibraryPath(v.(string)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(credentialLibraryVaultSshCertificateUsernameKey) {
|
||||||
|
v, ok := d.GetOk(credentialLibraryVaultSshCertificateUsernameKey)
|
||||||
|
if ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryUsername(v.(string)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(credentialLibraryVaultSshCertificateKeyTypeKey) {
|
||||||
|
v, ok := d.GetOk(credentialLibraryVaultSshCertificateKeyTypeKey)
|
||||||
|
if ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryKeyType(v.(string)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(credentialLibraryVaultSshCertificateKeyBitsKey) {
|
||||||
|
v, ok := d.GetOk(credentialLibraryVaultSshCertificateKeyBitsKey)
|
||||||
|
if ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryKeyBits(uint32(v.(int))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(credentialLibraryVaultSshCertificateTtlKey) {
|
||||||
|
v, ok := d.GetOk(credentialLibraryVaultSshCertificateTtlKey)
|
||||||
|
if ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryTtl(v.(string)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(credentialLibraryVaultSshCertificateKeyIdKey) {
|
||||||
|
v, ok := d.GetOk(credentialLibraryVaultSshCertificateKeyIdKey)
|
||||||
|
if ok {
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryKeyId(v.(string)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(credentialLibraryVaultSshCertificateCriticalOptionsKey) {
|
||||||
|
var oldCriticalOptions, newCriticalOptions map[string]interface{}
|
||||||
|
old, new := d.GetChange(credentialLibraryVaultSshCertificateCriticalOptionsKey)
|
||||||
|
|
||||||
|
if old == nil {
|
||||||
|
old = map[string]interface{}{}
|
||||||
|
}
|
||||||
|
oldCriticalOptions = old.(map[string]interface{})
|
||||||
|
|
||||||
|
if new == nil {
|
||||||
|
new = map[string]interface{}{}
|
||||||
|
}
|
||||||
|
newCriticalOptions = new.(map[string]interface{})
|
||||||
|
|
||||||
|
newAttrs := []string{}
|
||||||
|
for k := range newCriticalOptions {
|
||||||
|
newAttrs = append(newAttrs, k)
|
||||||
|
}
|
||||||
|
|
||||||
|
for oldAttr := range oldCriticalOptions {
|
||||||
|
isRemoved := true
|
||||||
|
for _, newAttr := range newAttrs {
|
||||||
|
if oldAttr == newAttr {
|
||||||
|
isRemoved = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if isRemoved {
|
||||||
|
newCriticalOptions[oldAttr] = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
co := make(map[string]string, 0)
|
||||||
|
for k, v := range newCriticalOptions {
|
||||||
|
if v != nil {
|
||||||
|
co[k] = v.(string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(co) == 0 {
|
||||||
|
co = nil
|
||||||
|
}
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryCriticalOptions(co))
|
||||||
|
|
||||||
|
}
|
||||||
|
if d.HasChange(credentialLibraryVaultSshCertificateExtensionsKey) {
|
||||||
|
var oldExtensions, newExtensions map[string]interface{}
|
||||||
|
old, new := d.GetChange(credentialLibraryVaultSshCertificateExtensionsKey)
|
||||||
|
|
||||||
|
if old == nil {
|
||||||
|
old = map[string]interface{}{}
|
||||||
|
}
|
||||||
|
oldExtensions = old.(map[string]interface{})
|
||||||
|
|
||||||
|
if new == nil {
|
||||||
|
new = map[string]interface{}{}
|
||||||
|
}
|
||||||
|
newExtensions = new.(map[string]interface{})
|
||||||
|
|
||||||
|
newAttrs := []string{}
|
||||||
|
for k := range newExtensions {
|
||||||
|
newAttrs = append(newAttrs, k)
|
||||||
|
}
|
||||||
|
|
||||||
|
for oldAttr := range oldExtensions {
|
||||||
|
isRemoved := true
|
||||||
|
for _, newAttr := range newAttrs {
|
||||||
|
if oldAttr == newAttr {
|
||||||
|
isRemoved = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if isRemoved {
|
||||||
|
newExtensions[oldAttr] = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
e := make(map[string]string, 0)
|
||||||
|
for k, v := range newExtensions {
|
||||||
|
if v != nil {
|
||||||
|
e[k] = v.(string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(e) == 0 {
|
||||||
|
e = nil
|
||||||
|
}
|
||||||
|
opts = append(opts, credentiallibraries.WithVaultSSHCertificateCredentialLibraryExtensions(e))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(opts) > 0 {
|
||||||
|
opts = append(opts, credentiallibraries.WithAutomaticVersioning(true))
|
||||||
|
aur, err := client.Update(ctx, d.Id(), 0, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return diag.Errorf("error updating credential library: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := setFromVaultSshCertificateCredentialLibraryResponseMap(d, aur.GetResponse().Map); err != nil {
|
||||||
|
return diag.Errorf("error setting credential library from response: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceCredentialLibraryDeleteVaultSshCertificate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
|
||||||
|
md := meta.(*metaData)
|
||||||
|
client := credentiallibraries.NewClient(md.client)
|
||||||
|
|
||||||
|
_, err := client.Delete(ctx, d.Id())
|
||||||
|
if err != nil {
|
||||||
|
return diag.Errorf("error deleting credential library: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@@ -0,0 +1,267 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
package provider
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/hashicorp/boundary/api"
|
||||||
|
"github.com/hashicorp/boundary/api/credentiallibraries"
|
||||||
|
"github.com/hashicorp/boundary/testing/controller"
|
||||||
|
"github.com/hashicorp/boundary/testing/vault"
|
||||||
|
"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"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
vaultSshCertCredResc = "boundary_credential_library_vault_ssh_certificate.example"
|
||||||
|
vaultSshCertCredExtCOResc = "boundary_credential_library_vault_ssh_certificate.ext_co_example"
|
||||||
|
vaultSshCertCredLibName = "foo"
|
||||||
|
vaultSshCertCredLibDesc = "the foo"
|
||||||
|
vaultSshCertCredLibPath = "/ssh/sign/foo"
|
||||||
|
vaultSshCertCredUsername = "bar"
|
||||||
|
vaultSshCertCredLibStringUpdate = "_random"
|
||||||
|
vaultSshCertCredKeyType = "ecdsa"
|
||||||
|
vaultSshCertCredKeyBits = 256
|
||||||
|
)
|
||||||
|
|
||||||
|
var vaultSshCertCredLibResource = fmt.Sprintf(`
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "example" {
|
||||||
|
name = "%s"
|
||||||
|
description = "%s"
|
||||||
|
credential_store_id = boundary_credential_store_vault.example.id
|
||||||
|
path = "%s"
|
||||||
|
username = "%s"
|
||||||
|
key_type = "ed25519"
|
||||||
|
|
||||||
|
}`, vaultSshCertCredLibName,
|
||||||
|
vaultSshCertCredLibDesc,
|
||||||
|
vaultSshCertCredLibPath,
|
||||||
|
vaultSshCertCredUsername)
|
||||||
|
|
||||||
|
var vaultSshCertCredLibResourceUpdate = fmt.Sprintf(`
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "example" {
|
||||||
|
name = "%s"
|
||||||
|
description = "%s"
|
||||||
|
credential_store_id = boundary_credential_store_vault.example.id
|
||||||
|
path = "%s"
|
||||||
|
username = "%s"
|
||||||
|
key_type = "%s"
|
||||||
|
key_bits = %d
|
||||||
|
}`, vaultSshCertCredLibName+vaultSshCertCredLibStringUpdate,
|
||||||
|
vaultSshCertCredLibDesc+vaultSshCertCredLibStringUpdate,
|
||||||
|
vaultSshCertCredLibPath+vaultSshCertCredLibStringUpdate,
|
||||||
|
vaultSshCertCredUsername+vaultSshCertCredLibStringUpdate,
|
||||||
|
vaultSshCertCredKeyType,
|
||||||
|
vaultSshCertCredKeyBits)
|
||||||
|
|
||||||
|
var vaultSshCertCredLibResourceExtensionsCriticalOpts = fmt.Sprintf(`
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "ext_co_example" {
|
||||||
|
name = "%s"
|
||||||
|
description = "%s"
|
||||||
|
credential_store_id = boundary_credential_store_vault.example.id
|
||||||
|
path = "%s"
|
||||||
|
username = "%s"
|
||||||
|
key_type = "ed25519"
|
||||||
|
|
||||||
|
extensions = {
|
||||||
|
permit-pty = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
critical_options = {
|
||||||
|
force-command = "/bin/foo"
|
||||||
|
}
|
||||||
|
}`, vaultSshCertCredLibName,
|
||||||
|
vaultSshCertCredLibDesc,
|
||||||
|
vaultSshCertCredLibPath,
|
||||||
|
vaultSshCertCredUsername)
|
||||||
|
|
||||||
|
var vaultSshCertCredLibResourceExtensionsCriticalOptsUpdate = fmt.Sprintf(`
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "ext_co_example" {
|
||||||
|
name = "%s"
|
||||||
|
description = "%s"
|
||||||
|
credential_store_id = boundary_credential_store_vault.example.id
|
||||||
|
path = "%s"
|
||||||
|
username = "%s"
|
||||||
|
key_type = "ed25519"
|
||||||
|
|
||||||
|
extensions = {
|
||||||
|
permit-pty = ""
|
||||||
|
permit-X11-forwarding = ""
|
||||||
|
}
|
||||||
|
}`, vaultSshCertCredLibName,
|
||||||
|
vaultSshCertCredLibDesc,
|
||||||
|
vaultSshCertCredLibPath,
|
||||||
|
vaultSshCertCredUsername)
|
||||||
|
|
||||||
|
var vaultSshCertCredLibResourceExtensionsCriticalOptsUpdate2 = fmt.Sprintf(`
|
||||||
|
resource "boundary_credential_library_vault_ssh_certificate" "ext_co_example" {
|
||||||
|
name = "%s"
|
||||||
|
description = "%s"
|
||||||
|
credential_store_id = boundary_credential_store_vault.example.id
|
||||||
|
path = "%s"
|
||||||
|
username = "%s"
|
||||||
|
key_type = "ed25519"
|
||||||
|
|
||||||
|
extensions = {
|
||||||
|
permit-pty = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
critical_options = {
|
||||||
|
force-command = "/bin/foo"
|
||||||
|
source-address = "10.10.0.0/16"
|
||||||
|
}
|
||||||
|
}`, vaultSshCertCredLibName,
|
||||||
|
vaultSshCertCredLibDesc,
|
||||||
|
vaultSshCertCredLibPath,
|
||||||
|
vaultSshCertCredUsername)
|
||||||
|
|
||||||
|
func TestAccCredentialLibraryVaultSshCertificate(t *testing.T) {
|
||||||
|
tc := controller.NewTestController(t, tcConfig...)
|
||||||
|
defer tc.Shutdown()
|
||||||
|
url := tc.ApiAddrs()[0]
|
||||||
|
|
||||||
|
vc := vault.NewTestVaultServer(t)
|
||||||
|
_, token := vc.CreateToken(t)
|
||||||
|
credStoreRes := vaultCredStoreResource(vc,
|
||||||
|
vaultCredStoreName,
|
||||||
|
vaultCredStoreDesc,
|
||||||
|
vaultCredStoreNamespace,
|
||||||
|
"www.original.com",
|
||||||
|
token,
|
||||||
|
true)
|
||||||
|
|
||||||
|
var provider *schema.Provider
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
IsUnitTest: true,
|
||||||
|
ProviderFactories: providerFactories(&provider),
|
||||||
|
CheckDestroy: testAccCheckCredentialLibraryVaultSshCertificateResourceDestroy(t, provider),
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
{
|
||||||
|
// create
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, credStoreRes, vaultSshCertCredLibResource),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, NameKey, vaultSshCertCredLibName),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, DescriptionKey, vaultSshCertCredLibDesc),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, credentialLibraryVaultPathKey, vaultSshCertCredLibPath),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, credentialLibraryVaultSshCertificateUsernameKey, vaultSshCertCredUsername),
|
||||||
|
|
||||||
|
testAccCheckCredentialLibraryVaultSshCertificateResourceExists(provider, vaultSshCertCredResc),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
importStep(vaultSshCertCredResc),
|
||||||
|
{
|
||||||
|
// update
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, credStoreRes, vaultSshCertCredLibResourceUpdate),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, NameKey, vaultSshCertCredLibName+vaultSshCertCredLibStringUpdate),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, DescriptionKey, vaultSshCertCredLibDesc+vaultSshCertCredLibStringUpdate),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, credentialLibraryVaultPathKey, vaultSshCertCredLibPath+vaultSshCertCredLibStringUpdate),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, credentialLibraryVaultSshCertificateUsernameKey, vaultSshCertCredUsername+vaultSshCertCredLibStringUpdate),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, credentialLibraryVaultSshCertificateKeyTypeKey, vaultSshCertCredKeyType),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredResc, credentialLibraryVaultSshCertificateKeyBitsKey, strconv.Itoa(vaultSshCertCredKeyBits)),
|
||||||
|
|
||||||
|
testAccCheckCredentialLibraryVaultSshCertificateResourceExists(provider, vaultSshCertCredResc),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
importStep(vaultSshCertCredResc),
|
||||||
|
{
|
||||||
|
// create with extensions and critical options
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, credStoreRes, vaultSshCertCredLibResourceExtensionsCriticalOpts),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, NameKey, vaultSshCertCredLibName),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, DescriptionKey, vaultSshCertCredLibDesc),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultPathKey, vaultSshCertCredLibPath),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultSshCertificateUsernameKey, vaultSshCertCredUsername),
|
||||||
|
|
||||||
|
testAccCheckCredentialLibraryVaultSshCertificateResourceExists(provider, vaultSshCertCredExtCOResc),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
importStep(vaultSshCertCredExtCOResc),
|
||||||
|
{
|
||||||
|
// update with extensions and remove critical options
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, credStoreRes, vaultSshCertCredLibResourceExtensionsCriticalOptsUpdate),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, NameKey, vaultSshCertCredLibName),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, DescriptionKey, vaultSshCertCredLibDesc),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultPathKey, vaultSshCertCredLibPath),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultSshCertificateUsernameKey, vaultSshCertCredUsername),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultSshCertificateCriticalOptionsKey+".%", "0"),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultSshCertificateExtensionsKey+".%", "2"),
|
||||||
|
|
||||||
|
testAccCheckCredentialLibraryVaultSshCertificateResourceExists(provider, vaultSshCertCredExtCOResc),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
importStep(vaultSshCertCredExtCOResc),
|
||||||
|
{
|
||||||
|
// update with extensions and remove critical options
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, credStoreRes, vaultSshCertCredLibResourceExtensionsCriticalOptsUpdate2),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, NameKey, vaultSshCertCredLibName),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, DescriptionKey, vaultSshCertCredLibDesc),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultPathKey, vaultSshCertCredLibPath),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultSshCertificateUsernameKey, vaultSshCertCredUsername),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultSshCertificateCriticalOptionsKey+".%", "2"),
|
||||||
|
resource.TestCheckResourceAttr(vaultSshCertCredExtCOResc, credentialLibraryVaultSshCertificateExtensionsKey+".%", "1"),
|
||||||
|
|
||||||
|
testAccCheckCredentialLibraryVaultSshCertificateResourceExists(provider, vaultSshCertCredExtCOResc),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
importStep(vaultSshCertCredExtCOResc),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccCheckCredentialLibraryVaultSshCertificateResourceExists(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")
|
||||||
|
}
|
||||||
|
|
||||||
|
md := testProvider.Meta().(*metaData)
|
||||||
|
c := credentiallibraries.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 testAccCheckCredentialLibraryVaultSshCertificateResourceDestroy(t *testing.T, testProvider *schema.Provider) 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 "boundary_credential_library_vault":
|
||||||
|
id := rs.Primary.ID
|
||||||
|
|
||||||
|
c := credentiallibraries.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 vault credential library %q: %v", id, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -19,6 +22,9 @@ const (
|
|||||||
targetSessionMaxSecondsKey = "session_max_seconds"
|
targetSessionMaxSecondsKey = "session_max_seconds"
|
||||||
targetSessionConnectionLimitKey = "session_connection_limit"
|
targetSessionConnectionLimitKey = "session_connection_limit"
|
||||||
targetWorkerFilterKey = "worker_filter"
|
targetWorkerFilterKey = "worker_filter"
|
||||||
|
targetWorkerEgressFilterKey = "egress_worker_filter"
|
||||||
|
targetWorkerIngressFilterKey = "ingress_worker_filter"
|
||||||
|
targetAddressKey = "address"
|
||||||
|
|
||||||
targetTypeTcp = "tcp"
|
targetTypeTcp = "tcp"
|
||||||
targetTypeSsh = "ssh"
|
targetTypeSsh = "ssh"
|
||||||
@@ -70,10 +76,11 @@ func resourceTarget() *schema.Resource {
|
|||||||
Optional: true,
|
Optional: true,
|
||||||
},
|
},
|
||||||
targetHostSourceIdsKey: {
|
targetHostSourceIdsKey: {
|
||||||
Description: "A list of host source ID's.",
|
Description: "A list of host source ID's. Cannot be used alongside address.",
|
||||||
Type: schema.TypeSet,
|
Type: schema.TypeSet,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
Elem: &schema.Schema{Type: schema.TypeString},
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||||||
|
ConflictsWith: []string{targetAddressKey},
|
||||||
},
|
},
|
||||||
targetBrokeredCredentialSourceIdsKey: {
|
targetBrokeredCredentialSourceIdsKey: {
|
||||||
Description: "A list of brokered credential source ID's.",
|
Description: "A list of brokered credential source ID's.",
|
||||||
@@ -101,6 +108,23 @@ func resourceTarget() *schema.Resource {
|
|||||||
Description: "Boolean expression to filter the workers for this target",
|
Description: "Boolean expression to filter the workers for this target",
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
|
Deprecated: "Deprecated. Use `egress_worker_filter` and `ingress_worker_filter` instead",
|
||||||
|
},
|
||||||
|
targetWorkerEgressFilterKey: {
|
||||||
|
Description: "Boolean expression to filter the workers used to access this target",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
targetWorkerIngressFilterKey: {
|
||||||
|
Description: "HCP Only. Boolean expression to filter the workers a user will connect to when initiating a session against this target",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
targetAddressKey: {
|
||||||
|
Description: "Optionally, a valid network address to connect to for this target. Cannot be used alongside host_source_ids.",
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
ConflictsWith: []string{targetHostSourceIdsKey},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -137,6 +161,15 @@ func setFromTargetResponseMap(d *schema.ResourceData, raw map[string]interface{}
|
|||||||
if err := d.Set(targetWorkerFilterKey, raw["worker_filter"]); err != nil {
|
if err := d.Set(targetWorkerFilterKey, raw["worker_filter"]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if err := d.Set(targetWorkerEgressFilterKey, raw["egress_worker_filter"]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := d.Set(targetWorkerIngressFilterKey, raw["ingress_worker_filter"]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := d.Set(targetAddressKey, raw["address"]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
switch raw["type"].(string) {
|
switch raw["type"].(string) {
|
||||||
case targetTypeTcp, targetTypeSsh:
|
case targetTypeTcp, targetTypeSsh:
|
||||||
@@ -255,6 +288,24 @@ func resourceTargetCreate(ctx context.Context, d *schema.ResourceData, meta inte
|
|||||||
opts = append(opts, targets.WithWorkerFilter(workerFilterStr))
|
opts = append(opts, targets.WithWorkerFilter(workerFilterStr))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
workerEgressFilterVal, ok := d.GetOk(targetWorkerEgressFilterKey)
|
||||||
|
if ok {
|
||||||
|
workerEgressFilterStr := workerEgressFilterVal.(string)
|
||||||
|
opts = append(opts, targets.WithEgressWorkerFilter(workerEgressFilterStr))
|
||||||
|
}
|
||||||
|
|
||||||
|
workerIngressFilterVal, ok := d.GetOk(targetWorkerIngressFilterKey)
|
||||||
|
if ok {
|
||||||
|
workerIngressFilterStr := workerIngressFilterVal.(string)
|
||||||
|
opts = append(opts, targets.WithIngressWorkerFilter(workerIngressFilterStr))
|
||||||
|
}
|
||||||
|
|
||||||
|
addrVal, ok := d.GetOk(targetAddressKey)
|
||||||
|
if ok {
|
||||||
|
addrStr := addrVal.(string)
|
||||||
|
opts = append(opts, targets.WithAddress(addrStr))
|
||||||
|
}
|
||||||
|
|
||||||
tc := targets.NewClient(md.client)
|
tc := targets.NewClient(md.client)
|
||||||
tcr, err := tc.Create(ctx, typeStr, scopeId, opts...)
|
tcr, err := tc.Create(ctx, typeStr, scopeId, opts...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -433,6 +484,39 @@ func resourceTargetUpdate(ctx context.Context, d *schema.ResourceData, meta inte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var workerEgressFilter *string
|
||||||
|
if d.HasChange(targetWorkerEgressFilterKey) {
|
||||||
|
opts = append(opts, targets.DefaultEgressWorkerFilter())
|
||||||
|
workerEgressFilterVal, ok := d.GetOk(targetWorkerEgressFilterKey)
|
||||||
|
if ok {
|
||||||
|
workerEgressFilterStr := workerEgressFilterVal.(string)
|
||||||
|
workerEgressFilter = &workerEgressFilterStr
|
||||||
|
opts = append(opts, targets.WithEgressWorkerFilter(workerEgressFilterStr))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var workerIngressFilter *string
|
||||||
|
if d.HasChange(targetWorkerIngressFilterKey) {
|
||||||
|
opts = append(opts, targets.DefaultIngressWorkerFilter())
|
||||||
|
workerIngressFilterVal, ok := d.GetOk(targetWorkerIngressFilterKey)
|
||||||
|
if ok {
|
||||||
|
workerIngressFilterStr := workerIngressFilterVal.(string)
|
||||||
|
workerIngressFilter = &workerIngressFilterStr
|
||||||
|
opts = append(opts, targets.WithIngressWorkerFilter(workerIngressFilterStr))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var addr *string
|
||||||
|
if d.HasChange(targetAddressKey) {
|
||||||
|
opts = append(opts, targets.DefaultAddress())
|
||||||
|
addrVal, ok := d.GetOk(targetAddressKey)
|
||||||
|
if ok {
|
||||||
|
addrStr := addrVal.(string)
|
||||||
|
addr = &addrStr
|
||||||
|
opts = append(opts, targets.WithAddress(addrStr))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if len(opts) > 0 {
|
if len(opts) > 0 {
|
||||||
opts = append(opts, targets.WithAutomaticVersioning(true))
|
opts = append(opts, targets.WithAutomaticVersioning(true))
|
||||||
_, err := tc.Update(ctx, d.Id(), 0, opts...)
|
_, err := tc.Update(ctx, d.Id(), 0, opts...)
|
||||||
@@ -471,6 +555,21 @@ func resourceTargetUpdate(ctx context.Context, d *schema.ResourceData, meta inte
|
|||||||
return diag.FromErr(err)
|
return diag.FromErr(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if d.HasChange(targetWorkerEgressFilterKey) {
|
||||||
|
if err := d.Set(targetWorkerEgressFilterKey, workerEgressFilter); err != nil {
|
||||||
|
return diag.FromErr(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(targetWorkerIngressFilterKey) {
|
||||||
|
if err := d.Set(targetWorkerIngressFilterKey, workerIngressFilter); err != nil {
|
||||||
|
return diag.FromErr(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if d.HasChange(targetAddressKey) {
|
||||||
|
if err := d.Set(targetAddressKey, addr); err != nil {
|
||||||
|
return diag.FromErr(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// The above call may not actually happen, so we use d.Id() and automatic
|
// The above call may not actually happen, so we use d.Id() and automatic
|
||||||
// versioning here
|
// versioning here
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -97,7 +100,7 @@ resource "boundary_target" "foo" {
|
|||||||
depends_on = [boundary_role.proj1_admin]
|
depends_on = [boundary_role.proj1_admin]
|
||||||
session_max_seconds = 6000
|
session_max_seconds = 6000
|
||||||
session_connection_limit = 6
|
session_connection_limit = 6
|
||||||
worker_filter = "type == \"foo\""
|
egress_worker_filter = "type == \"foo\""
|
||||||
}`, fooTargetDescription)
|
}`, fooTargetDescription)
|
||||||
|
|
||||||
fooTargetUpdate = fmt.Sprintf(`
|
fooTargetUpdate = fmt.Sprintf(`
|
||||||
@@ -116,7 +119,7 @@ resource "boundary_target" "foo" {
|
|||||||
depends_on = [boundary_role.proj1_admin]
|
depends_on = [boundary_role.proj1_admin]
|
||||||
session_max_seconds = 7000
|
session_max_seconds = 7000
|
||||||
session_connection_limit = 7
|
session_connection_limit = 7
|
||||||
worker_filter = "type == \"bar\""
|
egress_worker_filter = "type == \"bar\""
|
||||||
}`, fooTargetDescriptionUpdate)
|
}`, fooTargetDescriptionUpdate)
|
||||||
|
|
||||||
fooTargetUpdateUnsetHostAndCredSources = fmt.Sprintf(`
|
fooTargetUpdateUnsetHostAndCredSources = fmt.Sprintf(`
|
||||||
@@ -129,7 +132,7 @@ resource "boundary_target" "foo" {
|
|||||||
depends_on = [boundary_role.proj1_admin]
|
depends_on = [boundary_role.proj1_admin]
|
||||||
session_max_seconds = 7000
|
session_max_seconds = 7000
|
||||||
session_connection_limit = 7
|
session_connection_limit = 7
|
||||||
worker_filter = "type == \"bar\""
|
egress_worker_filter = "type == \"bar\""
|
||||||
}`, fooTargetDescriptionUpdate)
|
}`, fooTargetDescriptionUpdate)
|
||||||
|
|
||||||
fooTargetPartialSuccess = fmt.Sprintf(`
|
fooTargetPartialSuccess = fmt.Sprintf(`
|
||||||
@@ -146,6 +149,65 @@ resource "boundary_target" "foo" {
|
|||||||
boundary_credential_library_vault.bar.id
|
boundary_credential_library_vault.bar.id
|
||||||
]
|
]
|
||||||
}`, fooTargetDescription)
|
}`, fooTargetDescription)
|
||||||
|
|
||||||
|
fooTargetWithIPAddress = fmt.Sprintf(`
|
||||||
|
resource "boundary_target" "foo" {
|
||||||
|
name = "test"
|
||||||
|
description = "%s"
|
||||||
|
type = "tcp"
|
||||||
|
scope_id = boundary_scope.proj1.id
|
||||||
|
address = "127.0.0.1"
|
||||||
|
default_port = 22
|
||||||
|
depends_on = [boundary_role.proj1_admin]
|
||||||
|
}`, fooTargetDescription)
|
||||||
|
|
||||||
|
fooTargetWithDNSAddress = fmt.Sprintf(`
|
||||||
|
resource "boundary_target" "foo" {
|
||||||
|
name = "test"
|
||||||
|
description = "%s"
|
||||||
|
type = "tcp"
|
||||||
|
scope_id = boundary_scope.proj1.id
|
||||||
|
address = "localhost"
|
||||||
|
default_port = 22
|
||||||
|
depends_on = [boundary_role.proj1_admin]
|
||||||
|
}`, fooTargetDescription)
|
||||||
|
|
||||||
|
fooTargetUnsetAddress = fmt.Sprintf(`
|
||||||
|
resource "boundary_target" "foo" {
|
||||||
|
name = "test"
|
||||||
|
description = "%s"
|
||||||
|
type = "tcp"
|
||||||
|
scope_id = boundary_scope.proj1.id
|
||||||
|
default_port = 22
|
||||||
|
depends_on = [boundary_role.proj1_admin]
|
||||||
|
}`, fooTargetDescription)
|
||||||
|
|
||||||
|
fooTargetSetHostSource = fmt.Sprintf(`
|
||||||
|
resource "boundary_target" "foo" {
|
||||||
|
name = "test"
|
||||||
|
description = "%s"
|
||||||
|
type = "tcp"
|
||||||
|
scope_id = boundary_scope.proj1.id
|
||||||
|
default_port = 22
|
||||||
|
host_source_ids = [
|
||||||
|
boundary_host_set.foo.id
|
||||||
|
]
|
||||||
|
depends_on = [boundary_role.proj1_admin]
|
||||||
|
}`, fooTargetDescription)
|
||||||
|
|
||||||
|
fooTargetWithAddressAndHostSource = fmt.Sprintf(`
|
||||||
|
resource "boundary_target" "foo" {
|
||||||
|
name = "test"
|
||||||
|
description = "%s"
|
||||||
|
type = "tcp"
|
||||||
|
scope_id = boundary_scope.proj1.id
|
||||||
|
address = "localhost"
|
||||||
|
host_source_ids = [
|
||||||
|
boundary_host_set.foo.id
|
||||||
|
]
|
||||||
|
default_port = 22
|
||||||
|
depends_on = [boundary_role.proj1_admin]
|
||||||
|
}`, fooTargetDescription)
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestAccTarget(t *testing.T) {
|
func TestAccTarget(t *testing.T) {
|
||||||
@@ -180,7 +242,7 @@ func TestAccTarget(t *testing.T) {
|
|||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "22"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "22"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionMaxSecondsKey, "6000"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionMaxSecondsKey, "6000"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "6"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "6"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetWorkerFilterKey, `type == "foo"`),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetWorkerEgressFilterKey, `type == "foo"`),
|
||||||
testAccCheckTargetResourceHostSource(provider, "boundary_target.foo", []string{"boundary_host_set.foo"}),
|
testAccCheckTargetResourceHostSource(provider, "boundary_target.foo", []string{"boundary_host_set.foo"}),
|
||||||
testAccCheckTargetResourceBrokeredCredSources(provider, "boundary_target.foo", []string{"boundary_credential_library_vault.foo"}),
|
testAccCheckTargetResourceBrokeredCredSources(provider, "boundary_target.foo", []string{"boundary_credential_library_vault.foo"}),
|
||||||
),
|
),
|
||||||
@@ -195,7 +257,7 @@ func TestAccTarget(t *testing.T) {
|
|||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "80"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "80"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionMaxSecondsKey, "7000"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionMaxSecondsKey, "7000"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "7"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "7"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetWorkerFilterKey, `type == "bar"`),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetWorkerEgressFilterKey, `type == "bar"`),
|
||||||
testAccCheckTargetResourceHostSource(provider, "boundary_target.foo", []string{"boundary_host_set.bar"}),
|
testAccCheckTargetResourceHostSource(provider, "boundary_target.foo", []string{"boundary_host_set.bar"}),
|
||||||
testAccCheckTargetResourceBrokeredCredSources(provider, "boundary_target.foo", []string{"boundary_credential_library_vault.bar"}),
|
testAccCheckTargetResourceBrokeredCredSources(provider, "boundary_target.foo", []string{"boundary_credential_library_vault.bar"}),
|
||||||
),
|
),
|
||||||
@@ -210,7 +272,7 @@ func TestAccTarget(t *testing.T) {
|
|||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "80"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "80"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionMaxSecondsKey, "7000"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionMaxSecondsKey, "7000"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "7"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "7"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetWorkerFilterKey, `type == "bar"`),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetWorkerEgressFilterKey, `type == "bar"`),
|
||||||
testAccCheckTargetResourceHostSource(provider, "boundary_target.foo", nil),
|
testAccCheckTargetResourceHostSource(provider, "boundary_target.foo", nil),
|
||||||
testAccCheckTargetResourceBrokeredCredSources(provider, "boundary_target.foo", nil),
|
testAccCheckTargetResourceBrokeredCredSources(provider, "boundary_target.foo", nil),
|
||||||
),
|
),
|
||||||
@@ -240,7 +302,7 @@ func TestAccTarget(t *testing.T) {
|
|||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "80"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "80"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionMaxSecondsKey, "7000"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionMaxSecondsKey, "7000"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "7"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetSessionConnectionLimitKey, "7"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetWorkerFilterKey, `type == "bar"`),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetWorkerEgressFilterKey, `type == "bar"`),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetHostSourceIdsKey+".%", "0"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetHostSourceIdsKey+".%", "0"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetInjectedAppCredentialSourceIdsKey+".%", "0"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetInjectedAppCredentialSourceIdsKey+".%", "0"),
|
||||||
resource.TestCheckResourceAttr("boundary_target.foo", targetBrokeredCredentialSourceIdsKey+".%", "0"),
|
resource.TestCheckResourceAttr("boundary_target.foo", targetBrokeredCredentialSourceIdsKey+".%", "0"),
|
||||||
@@ -251,6 +313,130 @@ func TestAccTarget(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAccTargetWithAddress(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: testAccCheckTargetResourceDestroy(t, provider),
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
{
|
||||||
|
// test create
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, fooTargetWithIPAddress),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckTargetResourceExists(provider, "boundary_target.foo"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", NameKey, "test"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", DescriptionKey, fooTargetDescription),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", TypeKey, "tcp"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetAddressKey, "127.0.0.1"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "22"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
importStep("boundary_target.foo"),
|
||||||
|
{
|
||||||
|
// test update
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, fooTargetWithDNSAddress),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckTargetResourceExists(provider, "boundary_target.foo"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", NameKey, "test"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", DescriptionKey, fooTargetDescription),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", TypeKey, "tcp"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetAddressKey, "localhost"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "22"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
importStep("boundary_target.foo"),
|
||||||
|
{
|
||||||
|
// test update to unset address
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, fooTargetUnsetAddress),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckTargetResourceExists(provider, "boundary_target.foo"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", NameKey, "test"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", DescriptionKey, fooTargetDescription),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", TypeKey, "tcp"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "22"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetAddressKey, ""),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
importStep("boundary_target.foo"),
|
||||||
|
{
|
||||||
|
// test set host source
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, fooBarHostSet, fooTargetSetHostSource),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckTargetResourceExists(provider, "boundary_target.foo"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", NameKey, "test"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", DescriptionKey, fooTargetDescription),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", TypeKey, "tcp"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "22"),
|
||||||
|
testAccCheckTargetResourceHostSource(provider, "boundary_target.foo", []string{"boundary_host_set.foo"}),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAccTargetWithAddress_MoveToHostSourceDirectly(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: testAccCheckTargetResourceDestroy(t, provider),
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
{
|
||||||
|
// test create
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, fooTargetWithIPAddress),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckTargetResourceExists(provider, "boundary_target.foo"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", NameKey, "test"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", DescriptionKey, fooTargetDescription),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", TypeKey, "tcp"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetAddressKey, "127.0.0.1"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "22"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
importStep("boundary_target.foo"),
|
||||||
|
{
|
||||||
|
// test set host source
|
||||||
|
Config: testConfig(url, fooOrg, firstProjectFoo, fooBarHostSet, fooTargetSetHostSource),
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckTargetResourceExists(provider, "boundary_target.foo"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", NameKey, "test"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", DescriptionKey, fooTargetDescription),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", TypeKey, "tcp"),
|
||||||
|
resource.TestCheckResourceAttr("boundary_target.foo", targetDefaultPortKey, "22"),
|
||||||
|
testAccCheckTargetResourceHostSource(provider, "boundary_target.foo", []string{"boundary_host_set.foo"}),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAccTargetWithAddress_HostSourceAndAddressConflict(t *testing.T) {
|
||||||
|
var provider *schema.Provider
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
IsUnitTest: true,
|
||||||
|
ProviderFactories: providerFactories(&provider),
|
||||||
|
CheckDestroy: testAccCheckTargetResourceDestroy(t, provider),
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
{
|
||||||
|
// test create target with address and host source
|
||||||
|
Config: testConfig("not_required", fooOrg, firstProjectFoo, fooBarHostSet, fooTargetWithAddressAndHostSource),
|
||||||
|
ExpectError: regexp.MustCompile(`"address": conflicts with host_source_ids`),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func testAccCheckTargetResourceHostSource(testProvider *schema.Provider, name string, hostSources []string) resource.TestCheckFunc {
|
func testAccCheckTargetResourceHostSource(testProvider *schema.Provider, name string, hostSources []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]
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -43,9 +46,9 @@ func resourceWorker() *schema.Resource {
|
|||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
ScopeIdKey: {
|
ScopeIdKey: {
|
||||||
Description: "The scope for the worker.",
|
Description: "The scope for the worker. Defaults to `global`.",
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Optional: true,
|
||||||
},
|
},
|
||||||
NameKey: {
|
NameKey: {
|
||||||
Description: "The name for the worker.",
|
Description: "The name for the worker.",
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -66,6 +69,7 @@ func TestWorkerWorkerLed(t *testing.T) {
|
|||||||
|
|
||||||
var provider *schema.Provider
|
var provider *schema.Provider
|
||||||
resource.Test(t, resource.TestCase{
|
resource.Test(t, resource.TestCase{
|
||||||
|
IsUnitTest: true,
|
||||||
ProviderFactories: providerFactories(&provider),
|
ProviderFactories: providerFactories(&provider),
|
||||||
CheckDestroy: testAccCheckworkerResourceDestroy(t, provider),
|
CheckDestroy: testAccCheckworkerResourceDestroy(t, provider),
|
||||||
Steps: []resource.TestStep{
|
Steps: []resource.TestStep{
|
||||||
@@ -100,6 +104,7 @@ func TestWorkerControllerLed(t *testing.T) {
|
|||||||
|
|
||||||
var provider *schema.Provider
|
var provider *schema.Provider
|
||||||
resource.Test(t, resource.TestCase{
|
resource.Test(t, resource.TestCase{
|
||||||
|
IsUnitTest: true,
|
||||||
ProviderFactories: providerFactories(&provider),
|
ProviderFactories: providerFactories(&provider),
|
||||||
CheckDestroy: testAccCheckworkerResourceDestroy(t, provider),
|
CheckDestroy: testAccCheckworkerResourceDestroy(t, provider),
|
||||||
Steps: []resource.TestStep{
|
Steps: []resource.TestStep{
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package kms_plugin_assets
|
package kms_plugin_assets
|
||||||
|
|
||||||
const KmsPluginPrefix = "boundary-plugin-kms-"
|
const KmsPluginPrefix = "boundary-plugin-kms-"
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
|
|
||||||
# This script rewrites [GH-nnnn]-style references in the CHANGELOG.md file to
|
# This script rewrites [GH-nnnn]-style references in the CHANGELOG.md file to
|
||||||
# be Markdown links to the given github issues.
|
# be Markdown links to the given github issues.
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
#
|
#
|
||||||
# This script builds the required plugins for all supported distributions.
|
# This script builds the required plugins for all supported distributions.
|
||||||
set -e
|
set -e
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
# Copyright (c) HashiCorp, Inc.
|
||||||
|
# SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
#
|
#
|
||||||
# This script builds the required plugins.
|
# This script builds the required plugins.
|
||||||
set -e
|
set -e
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// Copyright (c) HashiCorp, Inc.
|
||||||
|
// SPDX-License-Identifier: MPL-2.0
|
||||||
|
|
||||||
//go:build tools
|
//go:build tools
|
||||||
// +build tools
|
// +build tools
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user