From 81304002081f87c4502e7927ebf6eb41176d63bc Mon Sep 17 00:00:00 2001 From: denys-octopus <102932057+denys-octopus@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:05:45 +1300 Subject: [PATCH] feat: Add listening tentacle worker (#812) --- docs/resources/azure_container_registry.md | 6 +- docs/resources/listening_tentacle_worker.md | 62 ++++++ .../import.sh | 1 + .../resource.tf | 17 ++ go.mod | 2 + octopusdeploy_framework/framework_provider.go | 1 + .../resource_azure_container_registry.go | 4 +- .../resource_listening_tentacle_worker.go | 174 ++++++++++++++++ ...resource_listening_tentacle_worker_test.go | 194 ++++++++++++++++++ .../schemas/listening_tentacle_worker.go | 54 +++++ 10 files changed, 510 insertions(+), 5 deletions(-) create mode 100644 docs/resources/listening_tentacle_worker.md create mode 100644 examples/resources/octopusdeploy_listening_tentacle_worker/import.sh create mode 100644 examples/resources/octopusdeploy_listening_tentacle_worker/resource.tf create mode 100644 octopusdeploy_framework/resource_listening_tentacle_worker.go create mode 100644 octopusdeploy_framework/resource_listening_tentacle_worker_test.go create mode 100644 octopusdeploy_framework/schemas/listening_tentacle_worker.go diff --git a/docs/resources/azure_container_registry.md b/docs/resources/azure_container_registry.md index 1c863c38..93dc192e 100644 --- a/docs/resources/azure_container_registry.md +++ b/docs/resources/azure_container_registry.md @@ -3,12 +3,12 @@ page_title: "octopusdeploy_azure_container_registry Resource - terraform-provider-octopusdeploy" subcategory: "" description: |- - This resource manages a Google Container Registry feed in Octopus Deploy (alias of Docker Container Registry feed) + This resource manages Azure Container Registry feed in Octopus Deploy (alias of Docker Container Registry feed) --- # octopusdeploy_azure_container_registry (Resource) -This resource manages a Google Container Registry feed in Octopus Deploy (alias of Docker Container Registry feed) +This resource manages Azure Container Registry feed in Octopus Deploy (alias of Docker Container Registry feed) ## Example Usage @@ -34,7 +34,7 @@ resource "octopusdeploy_azure_container_registry" "example" { - `api_version` (String) - `password` (String, Sensitive) The password associated with this resource. - `registry_path` (String) -- `space_id` (String) The space ID associated with this Google container registry feed. +- `space_id` (String) The space ID associated with this Azure container registry feed. - `username` (String, Sensitive) The username associated with this resource. ### Read-Only diff --git a/docs/resources/listening_tentacle_worker.md b/docs/resources/listening_tentacle_worker.md new file mode 100644 index 00000000..5a468a6e --- /dev/null +++ b/docs/resources/listening_tentacle_worker.md @@ -0,0 +1,62 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "octopusdeploy_listening_tentacle_worker Resource - terraform-provider-octopusdeploy" +subcategory: "" +description: |- + This resource manages a listening tentacle worker in Octopus Deploy. +--- + +# octopusdeploy_listening_tentacle_worker (Resource) + +This resource manages a listening tentacle worker in Octopus Deploy. + +## Example Usage + +```terraform +resource "octopusdeploy_listening_tentacle_worker" "minimum" { + name = "listening_worker" + machine_policy_id = "machine-policy-1" + worker_pools = ["worker-pools-1", "worker-pools-2"] + thumbprint = "96203ED84246201C26A2F4360D7CBC36AC1D232D" + uri = "https://tentacle.listening/" +} + +resource "octopusdeploy_listening_tentacle_worker" "optionals" { + name = "optional_worker" + machine_policy_id = "machine-policy-1" + worker_pools = ["worker-pools-1"] + thumbprint = "96203ED84246201C26A2F4360D7CBC36AC1D232D" + uri = "https://tentacle.listening/" + proxy_id = "proxys-1" + is_disabled = true +} +``` + + +## Schema + +### Required + +- `machine_policy_id` (String) Select the machine policy +- `name` (String) The name of this resource. +- `thumbprint` (String) The X509 certificate thumbprint that securely identifies the Tentacle +- `uri` (String) The network address at which the Tentacle can be reached +- `worker_pool_ids` (Set of String) Select at least one worker pool for the worker + +### Optional + +- `is_disabled` (Boolean) When disabled, worker will not be included in any deployments +- `proxy_id` (String) Specify the connection type for the Tentacle: direct(when not set) or via a proxy server. +- `space_id` (String) The space ID associated with this Listening tentacle worker. + +### Read-Only + +- `id` (String) The unique ID for this resource. + +## Import + +Import is supported using the following syntax: + +```shell +terraform import [options] octopusdeploy_listening_tentacle_worker. +``` diff --git a/examples/resources/octopusdeploy_listening_tentacle_worker/import.sh b/examples/resources/octopusdeploy_listening_tentacle_worker/import.sh new file mode 100644 index 00000000..90d6c7c9 --- /dev/null +++ b/examples/resources/octopusdeploy_listening_tentacle_worker/import.sh @@ -0,0 +1 @@ +terraform import [options] octopusdeploy_listening_tentacle_worker. \ No newline at end of file diff --git a/examples/resources/octopusdeploy_listening_tentacle_worker/resource.tf b/examples/resources/octopusdeploy_listening_tentacle_worker/resource.tf new file mode 100644 index 00000000..5cc29945 --- /dev/null +++ b/examples/resources/octopusdeploy_listening_tentacle_worker/resource.tf @@ -0,0 +1,17 @@ +resource "octopusdeploy_listening_tentacle_worker" "minimum" { + name = "listening_worker" + machine_policy_id = "machine-policy-1" + worker_pools = ["worker-pools-1", "worker-pools-2"] + thumbprint = "96203ED84246201C26A2F4360D7CBC36AC1D232D" + uri = "https://tentacle.listening/" +} + +resource "octopusdeploy_listening_tentacle_worker" "optionals" { + name = "optional_worker" + machine_policy_id = "machine-policy-1" + worker_pools = ["worker-pools-1"] + thumbprint = "96203ED84246201C26A2F4360D7CBC36AC1D232D" + uri = "https://tentacle.listening/" + proxy_id = "proxys-1" + is_disabled = true +} diff --git a/go.mod b/go.mod index 8dcc68c2..aac36869 100644 --- a/go.mod +++ b/go.mod @@ -142,3 +142,5 @@ require ( google.golang.org/protobuf v1.34.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) + + diff --git a/octopusdeploy_framework/framework_provider.go b/octopusdeploy_framework/framework_provider.go index 650596b5..1daab7df 100644 --- a/octopusdeploy_framework/framework_provider.go +++ b/octopusdeploy_framework/framework_provider.go @@ -119,6 +119,7 @@ func (p *octopusDeployFrameworkProvider) Resources(ctx context.Context) []func() NewRunbookResource, NewTenantResource, NewTentacleCertificateResource, + NewListeningTentacleWorkerResource, NewScriptModuleResource, NewUserResource, } diff --git a/octopusdeploy_framework/resource_azure_container_registry.go b/octopusdeploy_framework/resource_azure_container_registry.go index ae563802..0430a10a 100644 --- a/octopusdeploy_framework/resource_azure_container_registry.go +++ b/octopusdeploy_framework/resource_azure_container_registry.go @@ -30,7 +30,7 @@ func (r *azureContainerRegistryFeedTypeResource) Metadata(ctx context.Context, r } func (r *azureContainerRegistryFeedTypeResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) { - resp.Schema = schemas.GoogleContainerRegistryFeedSchema{}.GetResourceSchema() + resp.Schema = schemas.AzureContainerRegistryFeedSchema{}.GetResourceSchema() } func (r *azureContainerRegistryFeedTypeResource) Configure(_ context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { @@ -117,7 +117,7 @@ func (r *azureContainerRegistryFeedTypeResource) Update(ctx context.Context, req updateAzureDataFromDockerContainerRegistryFeed(data, state.SpaceID.ValueString(), updatedFeed.(*feeds.DockerContainerRegistry)) - tflog.Info(ctx, fmt.Sprintf("Google Container Registry feed updated (%s)", data.ID)) + tflog.Info(ctx, fmt.Sprintf("Azure Container Registry feed updated (%s)", data.ID)) resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) } diff --git a/octopusdeploy_framework/resource_listening_tentacle_worker.go b/octopusdeploy_framework/resource_listening_tentacle_worker.go new file mode 100644 index 00000000..0663656a --- /dev/null +++ b/octopusdeploy_framework/resource_listening_tentacle_worker.go @@ -0,0 +1,174 @@ +package octopusdeploy_framework + +import ( + "context" + "fmt" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/machines" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/workers" + "github.com/hashicorp/terraform-plugin-framework/path" + "net/url" + + "github.com/OctopusDeploy/terraform-provider-octopusdeploy/internal/errors" + "github.com/OctopusDeploy/terraform-provider-octopusdeploy/octopusdeploy_framework/schemas" + "github.com/OctopusDeploy/terraform-provider-octopusdeploy/octopusdeploy_framework/util" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-log/tflog" +) + +type listeningTentacleWorkerResource struct { + *Config +} + +func NewListeningTentacleWorkerResource() resource.Resource { + return &listeningTentacleWorkerResource{} +} + +var _ resource.ResourceWithImportState = &listeningTentacleWorkerResource{} + +func (r *listeningTentacleWorkerResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { + resp.TypeName = util.GetTypeName("listening_tentacle_worker") +} + +func (r *listeningTentacleWorkerResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) { + resp.Schema = schemas.ListeningTentacleWorkerSchema{}.GetResourceSchema() +} + +func (r *listeningTentacleWorkerResource) Configure(_ context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { + r.Config = ResourceConfiguration(req, resp) +} + +func (r *listeningTentacleWorkerResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { + var data *schemas.ListeningTentacleWorkerResourceModel + resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...) + if resp.Diagnostics.HasError() { + return + } + + worker := createListeningTentacleWorkerResource(ctx, data) + + tflog.Info(ctx, fmt.Sprintf("creating listening tentacle worker: %s", data.Name.ValueString())) + + client := r.Config.Client + createdWorker, err := workers.Add(client, worker) + if err != nil { + resp.Diagnostics.AddError("unable to create listening tentacle worker", err.Error()) + return + } + + updateDataFromListeningTentacleWorker(ctx, data, data.SpaceID.ValueString(), createdWorker) + + tflog.Info(ctx, fmt.Sprintf("listening tentacle worker created (%s)", data.ID)) + resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) +} + +func (r *listeningTentacleWorkerResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { + var data *schemas.ListeningTentacleWorkerResourceModel + resp.Diagnostics.Append(req.State.Get(ctx, &data)...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Info(ctx, fmt.Sprintf("reading listening tentacle worker (%s)", data.ID)) + + client := r.Config.Client + worker, err := workers.GetByID(client, data.SpaceID.ValueString(), data.ID.ValueString()) + if err != nil { + if err := errors.ProcessApiErrorV2(ctx, resp, data, err, "listening tentacle worker"); err != nil { + resp.Diagnostics.AddError("unable to load listening tentacle worker", err.Error()) + } + return + } + + if worker.Endpoint.GetCommunicationStyle() != "TentaclePassive" { + resp.Diagnostics.AddError("unable to load listening tentacle worker", "found resource is not listening tentacle worker") + return + } + + updateDataFromListeningTentacleWorker(ctx, data, data.SpaceID.ValueString(), worker) + + tflog.Info(ctx, fmt.Sprintf("listening tentacle worker read (%s)", worker.GetID())) + resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) +} + +func (r *listeningTentacleWorkerResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { + var data, state *schemas.ListeningTentacleWorkerResourceModel + resp.Diagnostics.Append(req.Plan.Get(ctx, &data)...) + resp.Diagnostics.Append(req.State.Get(ctx, &state)...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Debug(ctx, fmt.Sprintf("updating listening tentacle worker '%s'", data.ID.ValueString())) + + worker := createListeningTentacleWorkerResource(ctx, data) + worker.ID = state.ID.ValueString() + + tflog.Info(ctx, fmt.Sprintf("updating listening tentacle worker (%s)", data.ID)) + + client := r.Config.Client + updatedWorker, err := workers.Update(client, worker) + if err != nil { + resp.Diagnostics.AddError("unable to update listening tentacle worker", err.Error()) + return + } + + updateDataFromListeningTentacleWorker(ctx, data, state.SpaceID.ValueString(), updatedWorker) + + tflog.Info(ctx, fmt.Sprintf("listening tentacle worker updated (%s)", data.ID)) + + resp.Diagnostics.Append(resp.State.Set(ctx, &data)...) +} + +func (r *listeningTentacleWorkerResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { + var data schemas.ListeningTentacleWorkerResourceModel + + resp.Diagnostics.Append(req.State.Get(ctx, &data)...) + if resp.Diagnostics.HasError() { + return + } + + if err := workers.DeleteByID(r.Config.Client, data.SpaceID.ValueString(), data.ID.ValueString()); err != nil { + resp.Diagnostics.AddError("unable to delete listening tentacle worker", err.Error()) + return + } +} + +func createListeningTentacleWorkerResource(ctx context.Context, data *schemas.ListeningTentacleWorkerResourceModel) *machines.Worker { + uri, _ := url.Parse(data.Uri.ValueString()) + endpoint := machines.NewListeningTentacleEndpoint(uri, data.Thumbprint.ValueString()) + endpoint.ProxyID = data.ProxyID.ValueString() + + worker := machines.NewWorker(data.Name.ValueString(), endpoint) + worker.SpaceID = data.SpaceID.ValueString() + worker.IsDisabled = data.IsDisabled.ValueBool() + worker.MachinePolicyID = data.MachinePolicyID.ValueString() + + if !data.WorkerPoolIDs.IsNull() { + var workerPools []string + data.WorkerPoolIDs.ElementsAs(ctx, &workerPools, false) + worker.WorkerPoolIDs = workerPools + } + + return worker +} + +func updateDataFromListeningTentacleWorker(ctx context.Context, data *schemas.ListeningTentacleWorkerResourceModel, spaceId string, worker *machines.Worker) { + data.ID = types.StringValue(worker.ID) + data.SpaceID = types.StringValue(spaceId) + data.Name = types.StringValue(worker.Name) + data.IsDisabled = types.BoolValue(worker.IsDisabled) + data.MachinePolicyID = types.StringValue(worker.MachinePolicyID) + data.WorkerPoolIDs, _ = types.SetValueFrom(ctx, types.StringType, worker.WorkerPoolIDs) + + endpoint := worker.Endpoint.(*machines.ListeningTentacleEndpoint) + data.Uri = types.StringValue(endpoint.URI.String()) + data.Thumbprint = types.StringValue(endpoint.Thumbprint) + if endpoint.ProxyID != "" { + data.ProxyID = types.StringValue(endpoint.ProxyID) + } +} + +func (*listeningTentacleWorkerResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { + resource.ImportStatePassthroughID(ctx, path.Root("id"), req, resp) +} diff --git a/octopusdeploy_framework/resource_listening_tentacle_worker_test.go b/octopusdeploy_framework/resource_listening_tentacle_worker_test.go new file mode 100644 index 00000000..e42fc3f0 --- /dev/null +++ b/octopusdeploy_framework/resource_listening_tentacle_worker_test.go @@ -0,0 +1,194 @@ +package octopusdeploy_framework + +import ( + "fmt" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/workers" + "github.com/hashicorp/terraform-plugin-testing/helper/acctest" + "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/terraform" + "strconv" + "testing" +) + +type listeningTentacleWorkerTestData struct { + name string + spaceID string + isDisabled bool + uri string + thumbprint string +} + +type listeningTentacleWorkerTestDependenciesData struct { + policy string + pool1 string + pool2 string + proxy string +} + +func TestAccOctopusDeployListeningTentacleWorker(t *testing.T) { + localName := acctest.RandStringFromCharSet(20, acctest.CharSetAlpha) + prefix := "octopusdeploy_listening_tentacle_worker." + localName + createData := listeningTentacleWorkerTestData{ + name: acctest.RandStringFromCharSet(20, acctest.CharSetAlpha), + uri: "https://listening.test/", + thumbprint: strconv.FormatInt(int64(acctest.RandIntRange(0, 1024)), 16), + } + updateData := listeningTentacleWorkerTestData{ + name: createData.name + "-updated", + uri: "https://listening.test.updated/", + thumbprint: strconv.FormatInt(int64(acctest.RandIntRange(0, 1024)), 16), + isDisabled: true, + } + + resource.Test(t, resource.TestCase{ + CheckDestroy: func(s *terraform.State) error { return testListeningTentacleWorkerCheckDestroy(s) }, + PreCheck: func() { TestAccPreCheck(t) }, + ProtoV6ProviderFactories: ProtoV6ProviderFactories(), + Steps: []resource.TestStep{ + { + Config: testListeningTentacleWorkerCreate(createData, localName), + Check: testAssertListeningTentacleWorkerCreate(createData, prefix), + }, + { + Config: testListeningTentacleWorkerUpdate(updateData, localName), + Check: testAssertListeningTentacleWorkerUpdate(updateData, prefix), + }, + }, + }) +} + +func testListeningTentacleWorkerCreate(data listeningTentacleWorkerTestData, localName string) string { + source, references := testListeningTentacleWorkerDependencies(localName) + + return fmt.Sprintf(` + %s + resource "octopusdeploy_listening_tentacle_worker" "%s" { + name = "%s" + machine_policy_id = %s + worker_pool_ids = [%s] + uri = "%s" + thumbprint = "%s" + } + `, + source, + localName, + data.name, + references.policy, + references.pool1, + data.uri, + data.thumbprint, + ) +} + +func testAssertListeningTentacleWorkerCreate(expected listeningTentacleWorkerTestData, prefix string) resource.TestCheckFunc { + return resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(prefix, "name", expected.name), + resource.TestCheckResourceAttrSet(prefix, "machine_policy_id"), + resource.TestCheckResourceAttr(prefix, "worker_pool_ids.#", "1"), + resource.TestCheckResourceAttr(prefix, "uri", expected.uri), + resource.TestCheckResourceAttr(prefix, "thumbprint", expected.thumbprint), + resource.TestCheckNoResourceAttr(prefix, "proxy_id"), + resource.TestCheckResourceAttr(prefix, "is_disabled", "false"), + ) +} + +func testListeningTentacleWorkerUpdate(data listeningTentacleWorkerTestData, localName string) string { + source, references := testListeningTentacleWorkerDependencies(localName) + + return fmt.Sprintf(` + %s + resource "octopusdeploy_listening_tentacle_worker" "%s" { + name = "%s" + machine_policy_id = %s + worker_pool_ids = [%s, %s] + uri = "%s" + thumbprint = "%s" + proxy_id = %s + is_disabled = %v + } + `, + source, + localName, + data.name, + references.policy, + references.pool1, + references.pool2, + data.uri, + data.thumbprint, + references.proxy, + data.isDisabled, + ) +} + +func testAssertListeningTentacleWorkerUpdate(expected listeningTentacleWorkerTestData, prefix string) resource.TestCheckFunc { + return resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(prefix, "name", expected.name), + resource.TestCheckResourceAttrSet(prefix, "machine_policy_id"), + resource.TestCheckResourceAttr(prefix, "worker_pool_ids.#", "2"), + resource.TestCheckResourceAttr(prefix, "uri", expected.uri), + resource.TestCheckResourceAttr(prefix, "thumbprint", expected.thumbprint), + resource.TestCheckResourceAttrSet(prefix, "proxy_id"), + resource.TestCheckResourceAttr(prefix, "is_disabled", strconv.FormatBool(expected.isDisabled)), + ) +} + +func testListeningTentacleWorkerDependencies(localName string) (string, listeningTentacleWorkerTestDependenciesData) { + policy := fmt.Sprintf("policy_%s", localName) + pool1 := fmt.Sprintf("pool_1_%s", localName) + pool2 := fmt.Sprintf("pool_2_%s", localName) + proxy := fmt.Sprintf("proxy_%s", localName) + source := fmt.Sprintf(` + resource "octopusdeploy_machine_policy" "%s" { + name = "Listening policy" + } + + resource "octopusdeploy_static_worker_pool" "%s" { + name = "Listening poll 1" + description = "First pool of listening workers" + sort_order = 42 + } + + resource "octopusdeploy_static_worker_pool" "%s" { + name = "Listening poll 2" + description = "Second pool of listening workers" + sort_order = 43 + } + + resource "octopusdeploy_machine_proxy" "%s" { + name = "Listening proxy" + host = "localhost" + port = 20034 + username = "user_proxy" + password = "secret_proxy" + } + `, + policy, + pool1, + pool2, + proxy, + ) + + dependencies := listeningTentacleWorkerTestDependenciesData{ + policy: fmt.Sprintf("octopusdeploy_machine_policy.%s.id", policy), + pool1: fmt.Sprintf("octopusdeploy_static_worker_pool.%s.id", pool1), + pool2: fmt.Sprintf("octopusdeploy_static_worker_pool.%s.id", pool2), + proxy: fmt.Sprintf("octopusdeploy_machine_proxy.%s.id", proxy), + } + + return source, dependencies +} + +func testListeningTentacleWorkerCheckDestroy(s *terraform.State) error { + for _, rs := range s.RootModule().Resources { + if rs.Type != "octopusdeploy_listening_tentacle_worker" { + continue + } + + feed, err := workers.GetByID(octoClient, octoClient.GetSpaceID(), rs.Primary.ID) + if err == nil && feed != nil { + return fmt.Errorf("listening tentacle worker (%s) still exists", rs.Primary.ID) + } + } + + return nil +} diff --git a/octopusdeploy_framework/schemas/listening_tentacle_worker.go b/octopusdeploy_framework/schemas/listening_tentacle_worker.go new file mode 100644 index 00000000..c8e032dc --- /dev/null +++ b/octopusdeploy_framework/schemas/listening_tentacle_worker.go @@ -0,0 +1,54 @@ +package schemas + +import ( + "github.com/hashicorp/terraform-plugin-framework-validators/setvalidator" + datasourceSchema "github.com/hashicorp/terraform-plugin-framework/datasource/schema" + resourceSchema "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/schema/validator" + "github.com/hashicorp/terraform-plugin-framework/types" +) + +type ListeningTentacleWorkerSchema struct{} + +func (m ListeningTentacleWorkerSchema) GetResourceSchema() resourceSchema.Schema { + return resourceSchema.Schema{ + Description: "This resource manages a listening tentacle worker in Octopus Deploy.", + Attributes: map[string]resourceSchema.Attribute{ + "id": GetIdResourceSchema(), + "name": GetNameResourceSchema(true), + "space_id": GetSpaceIdResourceSchema("Listening tentacle worker"), + "is_disabled": GetOptionalBooleanResourceAttribute("When disabled, worker will not be included in any deployments", false), + "machine_policy_id": GetRequiredStringResourceSchema("Select the machine policy"), + "uri": GetRequiredStringResourceSchema("The network address at which the Tentacle can be reached"), + "thumbprint": GetRequiredStringResourceSchema("The X509 certificate thumbprint that securely identifies the Tentacle"), + "proxy_id": GetOptionalStringResourceSchema("Specify the connection type for the Tentacle: direct(when not set) or via a proxy server."), + "worker_pool_ids": resourceSchema.SetAttribute{ + ElementType: types.StringType, + Description: "Select at least one worker pool for the worker", + Required: true, + Validators: []validator.Set{ + setvalidator.SizeAtLeast(1), + }, + }, + }, + } +} + +func (m ListeningTentacleWorkerSchema) GetDatasourceSchema() datasourceSchema.Schema { + return datasourceSchema.Schema{} +} + +var _ EntitySchema = ListeningTentacleWorkerSchema{} + +type ListeningTentacleWorkerResourceModel struct { + Name types.String `tfsdk:"name"` + SpaceID types.String `tfsdk:"space_id"` + IsDisabled types.Bool `tfsdk:"is_disabled"` + WorkerPoolIDs types.Set `tfsdk:"worker_pool_ids"` + MachinePolicyID types.String `tfsdk:"machine_policy_id"` + Uri types.String `tfsdk:"uri"` + Thumbprint types.String `tfsdk:"thumbprint"` + ProxyID types.String `tfsdk:"proxy_id"` + + ResourceModel +}