Skip to content

Commit

Permalink
Add Monolith condition
Browse files Browse the repository at this point in the history
  • Loading branch information
np5 committed Mar 8, 2023
1 parent fb4021b commit bcbb5cb
Show file tree
Hide file tree
Showing 9 changed files with 495 additions and 3 deletions.
27 changes: 27 additions & 0 deletions docs/resources/monolith_condition.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "zentral_monolith_condition Resource - terraform-provider-zentral"
subcategory: ""
description: |-
The resource zentral_monolith_condition manages Monolith conditions.
---

# zentral_monolith_condition (Resource)

The resource `zentral_monolith_condition` manages Monolith conditions.



<!-- schema generated by tfplugindocs -->
## Schema

### Required

- `name` (String) Name of the condition.
- `predicate` (String) Predicate of the condition.

### Read-Only

- `id` (Number) `ID` of the condition.


2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ require (
github.com/hashicorp/terraform-plugin-go v0.14.3
github.com/hashicorp/terraform-plugin-log v0.8.0
github.com/hashicorp/terraform-plugin-sdk/v2 v2.25.0
github.com/zentralopensource/goztl v0.1.25
github.com/zentralopensource/goztl v0.1.26
)

require (
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -233,8 +233,8 @@ github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uU
github.com/zclconf/go-cty v1.13.0 h1:It5dfKTTZHe9aeppbNOda3mN7Ag7sg6QkBNm6TkyFa0=
github.com/zclconf/go-cty v1.13.0/go.mod h1:YKQzy/7pZ7iq2jNFzy5go57xdxdWoLLpaEp4u238AE0=
github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8=
github.com/zentralopensource/goztl v0.1.25 h1:TmTlsMl+WW29JEgN9NHd8O26tdia7AODHpVgPHJg/Mw=
github.com/zentralopensource/goztl v0.1.25/go.mod h1:zakEe4QjAUvawFpzehwryMM5f2RI61a8m1wcNxQ8G/A=
github.com/zentralopensource/goztl v0.1.26 h1:lDW5VBCURlqQVldKEtuQn0QHifcEFux5Iv34Qx8TIPs=
github.com/zentralopensource/goztl v0.1.26/go.mod h1:zakEe4QjAUvawFpzehwryMM5f2RI61a8m1wcNxQ8G/A=
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
Expand Down
27 changes: 27 additions & 0 deletions internal/provider/monolith_condition.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package provider

import (
"github.com/hashicorp/terraform-plugin-framework/types"
"github.com/zentralopensource/goztl"
)

type monolithCondition struct {
ID types.Int64 `tfsdk:"id"`
Name types.String `tfsdk:"name"`
Predicate types.String `tfsdk:"predicate"`
}

func monolithConditionForState(mc *goztl.MonolithCondition) monolithCondition {
return monolithCondition{
ID: types.Int64Value(int64(mc.ID)),
Name: types.StringValue(mc.Name),
Predicate: types.StringValue(mc.Predicate),
}
}

func monolithConditionRequestWithState(data monolithCondition) *goztl.MonolithConditionRequest {
return &goztl.MonolithConditionRequest{
Name: data.Name.ValueString(),
Predicate: data.Predicate.ValueString(),
}
}
127 changes: 127 additions & 0 deletions internal/provider/monolith_condition_data_source.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package provider

import (
"context"
"fmt"

"github.com/hashicorp/terraform-plugin-framework/datasource"
"github.com/hashicorp/terraform-plugin-framework/datasource/schema"
"github.com/zentralopensource/goztl"
)

// Ensure provider defined types fully satisfy framework interfaces
var _ datasource.DataSource = &MonolithConditionDataSource{}

func NewMonolithConditionDataSource() datasource.DataSource {
return &MonolithConditionDataSource{}
}

// MonolithConditionDataSource defines the data source implementation.
type MonolithConditionDataSource struct {
client *goztl.Client
}

func (d *MonolithConditionDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
resp.TypeName = req.ProviderTypeName + "_monolith_condition"
}

func (d *MonolithConditionDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) {
resp.Schema = schema.Schema{
Description: "Allows details of a Monolith condition to be retrieved by its ID or its name.",
MarkdownDescription: "The data source `zentral_monolith_condition` allows details of a Monolith condition to be retrieved by its `ID` or its `name`.",

Attributes: map[string]schema.Attribute{
"id": schema.Int64Attribute{
Description: "ID of the Monolith condition.",
MarkdownDescription: "`ID` of the Monolith condition.",
Optional: true,
},
"name": schema.StringAttribute{
Description: "Name of the condition.",
MarkdownDescription: "Name of the condition.",
Optional: true,
},
"predicate": schema.StringAttribute{
Description: "Predicate of the condition.",
MarkdownDescription: "Predicate of the condition.",
Computed: true,
},
},
}
}

func (d *MonolithConditionDataSource) Configure(ctx context.Context, req datasource.ConfigureRequest, resp *datasource.ConfigureResponse) {
// Prevent panic if the provider has not been configured.
if req.ProviderData == nil {
return
}

client, ok := req.ProviderData.(*goztl.Client)

if !ok {
resp.Diagnostics.AddError(
"Unexpected Data Source Configure Type",
fmt.Sprintf("Expected *goztl.Client, got: %T. Please report this issue to the provider developers.", req.ProviderData),
)

return
}

d.client = client
}

func (d *MonolithConditionDataSource) ValidateConfig(ctx context.Context, req datasource.ValidateConfigRequest, resp *datasource.ValidateConfigResponse) {
var data monolithCondition
diags := req.Config.Get(ctx, &data)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}

if data.ID.IsNull() && data.Name.IsNull() {
resp.Diagnostics.AddError(
"Invalid `zentral_monolith_condition` data source",
"`id` or `name` missing",
)
} else if !data.ID.IsNull() && !data.Name.IsNull() {
resp.Diagnostics.AddError(
"Invalid `zentral_monolith_condition` data source",
"`id` and `name` cannot be both set",
)
}
}

func (d *MonolithConditionDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
var data monolithCondition

// Read Terraform condition data into the model
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)

if resp.Diagnostics.HasError() {
return
}

var ztlMM *goztl.MonolithCondition
var err error
if data.ID.ValueInt64() > 0 {
ztlMM, _, err = d.client.MonolithConditions.GetByID(ctx, int(data.ID.ValueInt64()))
if err != nil {
resp.Diagnostics.AddError(
"Client Error",
fmt.Sprintf("Unable to get Monolith condition '%d' by ID, got error: %s", data.ID.ValueInt64(), err),
)
}
} else {
ztlMM, _, err = d.client.MonolithConditions.GetByName(ctx, data.Name.ValueString())
if err != nil {
resp.Diagnostics.AddError(
"Client Error",
fmt.Sprintf("Unable to get Monolith condition '%s' by name, got error: %s", data.Name.ValueString(), err),
)
}
}

if ztlMM != nil {
resp.Diagnostics.Append(resp.State.Set(ctx, monolithConditionForState(ztlMM))...)
}
}
67 changes: 67 additions & 0 deletions internal/provider/monolith_condition_data_source_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package provider

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func TestAccMonolithConditionDataSource(t *testing.T) {
c1Name := acctest.RandString(12)
c2Name := acctest.RandString(12)
c1ResourceName := "zentral_monolith_condition.test1"
c2ResourceName := "zentral_monolith_condition.test2"
ds1ResourceName := "data.zentral_monolith_condition.test_by_id"
ds2ResourceName := "data.zentral_monolith_condition.test_by_name"

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
Steps: []resource.TestStep{
{
Config: testAccMonolithConditionDataSourceConfig(c1Name, c2Name),
Check: resource.ComposeAggregateTestCheckFunc(
// Read by id
resource.TestCheckResourceAttrPair(
ds1ResourceName, "id", c1ResourceName, "id"),
resource.TestCheckResourceAttr(
ds1ResourceName, "name", c1Name),
resource.TestCheckResourceAttr(
ds1ResourceName, "predicate", "machine_type == \"desktop\""),
// Read by name
resource.TestCheckResourceAttrPair(
ds2ResourceName, "id", c2ResourceName, "id"),
resource.TestCheckResourceAttr(
ds2ResourceName, "name", c2Name),
resource.TestCheckResourceAttr(
ds2ResourceName, "predicate", "machine_type == \"laptop\""),
),
},
},
})
}

func testAccMonolithConditionDataSourceConfig(c1Name string, c2Name string) string {
return fmt.Sprintf(`
resource "zentral_monolith_condition" "test1" {
name = %[1]q
predicate = "machine_type == \"desktop\""
}
resource "zentral_monolith_condition" "test2" {
name = %[2]q
predicate = "machine_type == \"laptop\""
}
data "zentral_monolith_condition" "test_by_id" {
id = zentral_monolith_condition.test1.id
}
data "zentral_monolith_condition" "test_by_name" {
name = zentral_monolith_condition.test2.name
}
`, c1Name, c2Name)
}
Loading

0 comments on commit bcbb5cb

Please sign in to comment.