From 386ce1d0e2508a29b2661453990ae3569e73a4c7 Mon Sep 17 00:00:00 2001 From: Dainius Date: Mon, 27 Jan 2025 12:52:09 +0200 Subject: [PATCH 1/7] Add vcfa_org_networking resource + data source Signed-off-by: Dainius --- go.mod | 2 + go.sum | 4 +- vcfa/datasource_vcfa_org_networking.go | 57 ++++++++ vcfa/provider.go | 2 + vcfa/resource_vcfa_org_networking.go | 148 ++++++++++++++++++++ vcfa/resource_vcfa_org_networking_test.go | 104 ++++++++++++++ vcfa/structure.go | 8 ++ website/docs/d/org_networking.html.markdown | 35 +++++ website/docs/r/org_networking.html.markdown | 57 ++++++++ website/vcfa.erb | 6 + 10 files changed, 421 insertions(+), 2 deletions(-) create mode 100644 vcfa/datasource_vcfa_org_networking.go create mode 100644 vcfa/resource_vcfa_org_networking.go create mode 100644 vcfa/resource_vcfa_org_networking_test.go create mode 100644 website/docs/d/org_networking.html.markdown create mode 100644 website/docs/r/org_networking.html.markdown diff --git a/go.mod b/go.mod index e3a45552..f7582886 100644 --- a/go.mod +++ b/go.mod @@ -66,3 +66,5 @@ require ( google.golang.org/protobuf v1.35.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) + +replace github.com/vmware/go-vcloud-director/v3 => github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127104832-feb6cd1b5d8b diff --git a/go.sum b/go.sum index d955ed41..954fff7c 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127104832-feb6cd1b5d8b h1:dcMNHd3eG8m4MBrOKdwLQJ55a25+dq2uTlPT3/Wxz1Q= +github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127104832-feb6cd1b5d8b/go.mod h1:68KHsVns52dsq/w5JQYzauaU/+NAi1FmCxhBrFc/VoQ= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/ProtonMail/go-crypto v1.1.0-alpha.2 h1:bkyFVUP+ROOARdgCiJzNQo2V2kiB97LyUpzH9P6Hrlg= @@ -149,8 +151,6 @@ github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IU github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/vmware/go-vcloud-director/v3 v3.0.0-alpha.19 h1:NHrxpeebuqKYvIac/cynOhSzoK0iI9RowF0b2g00ypg= -github.com/vmware/go-vcloud-director/v3 v3.0.0-alpha.19/go.mod h1:68KHsVns52dsq/w5JQYzauaU/+NAi1FmCxhBrFc/VoQ= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= diff --git a/vcfa/datasource_vcfa_org_networking.go b/vcfa/datasource_vcfa_org_networking.go new file mode 100644 index 00000000..a4fd34e1 --- /dev/null +++ b/vcfa/datasource_vcfa_org_networking.go @@ -0,0 +1,57 @@ +package vcfa + +import ( + "context" + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func datasourceVcfaOrgNetworking() *schema.Resource { + return &schema.Resource{ + ReadContext: datasourceVcfaOrgNetworkingRead, + + Schema: map[string]*schema.Schema{ + "org_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: fmt.Sprintf("Parent %s for %s", labelVcfaOrg, labelVcfaOrgNetworking), + }, + "log_name": { + Type: schema.TypeString, + Computed: true, + Description: fmt.Sprintf("A globally unique identifier (max 8 char) for this %s in the logs of the backing network provider", labelVcfaOrg), + }, + "networking_tenancy_enabled": { + Type: schema.TypeBool, + Computed: true, + Description: "Whether this Organization has tenancy for the network domain in the backing network provider", + }, + }, + } +} + +func datasourceVcfaOrgNetworkingRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + vcfaClient := meta.(*VCDClient) + org, err := vcfaClient.GetTmOrgById(d.Get("org_id").(string)) + if err != nil { + return diag.Errorf("error retrieving %s: %s", labelVcfaOrg, err) + } + + d.SetId(org.TmOrg.ID) + dSet(d, "org_id", org.TmOrg.ID) + + orgNetworkingSettings, err := org.GetOrgNetworkingSettings() + if err != nil { + return diag.Errorf("error retrieving %s for %s:%s", labelVcfaOrgNetworking, labelVcfaOrg, err) + } + + err = setTmOrgNetworkingSettingsData(vcfaClient, d, orgNetworkingSettings) + if err != nil { + return diag.Errorf("error storing read %s: %s", labelVcfaOrgNetworking, err) + } + + return nil +} diff --git a/vcfa/provider.go b/vcfa/provider.go index de11f933..9ff5f415 100644 --- a/vcfa/provider.go +++ b/vcfa/provider.go @@ -50,6 +50,7 @@ var globalDataSourceMap = map[string]*schema.Resource{ "vcfa_provider_gateway": datasourceVcfaProviderGateway(), // 1.0 "vcfa_edge_cluster": datasourceVcfaEdgeCluster(), // 1.0 "vcfa_edge_cluster_qos": datasourceVcfaEdgeClusterQos(), // 1.0 + "vcfa_org_networking": datasourceVcfaOrgNetworking(), // 1.0 } var globalResourceMap = map[string]*schema.Resource{ @@ -63,6 +64,7 @@ var globalResourceMap = map[string]*schema.Resource{ "vcfa_content_library_item": resourceVcfaContentLibraryItem(), // 1.0 "vcfa_provider_gateway": resourceVcfaProviderGateway(), // 1.0 "vcfa_edge_cluster_qos": resourceVcfaEdgeClusterQos(), // 1.0 + "vcfa_org_networking": resourceVcfaOrgNetworking(), // 1.0 } // Provider returns a terraform.ResourceProvider. diff --git a/vcfa/resource_vcfa_org_networking.go b/vcfa/resource_vcfa_org_networking.go new file mode 100644 index 00000000..10e38e60 --- /dev/null +++ b/vcfa/resource_vcfa_org_networking.go @@ -0,0 +1,148 @@ +package vcfa + +import ( + "context" + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + "github.com/vmware/go-vcloud-director/v3/govcd" + "github.com/vmware/go-vcloud-director/v3/types/v56" +) + +const labelVcfaOrgNetworking = "Organization Networking Settings" + +func resourceVcfaOrgNetworking() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceVcfaOrgNetworkingCreateUpdate, + ReadContext: resourceVcfaOrgNetworkingRead, + UpdateContext: resourceVcfaOrgNetworkingCreateUpdate, + DeleteContext: resourceVcfaOrgNetworkingDelete, + Importer: &schema.ResourceImporter{ + StateContext: resourceVcfaOrgNetworkingImport, // The same as importing the Org + }, + + Schema: map[string]*schema.Schema{ + "org_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: fmt.Sprintf("Parent %s for %s", labelVcfaOrg, labelVcfaOrgNetworking), + }, + "log_name": { + Type: schema.TypeString, + Required: true, + Description: fmt.Sprintf("A globally unique identifier (max 8 char) for this %s in the logs of the backing network provider", labelVcfaOrg), + ValidateDiagFunc: validation.ToDiagFunc(validation.StringLenBetween(1, 8)), + }, + "networking_tenancy_enabled": { + Type: schema.TypeBool, + Computed: true, + Description: "Whether this Organization has tenancy for the network domain in the backing network provider", + }, + }, + } +} + +func resourceVcfaOrgNetworkingCreateUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + vcfaClient := meta.(*VCDClient) + + org, err := vcfaClient.GetTmOrgById(d.Get("org_id").(string)) + if err != nil { + return diag.Errorf("error retrieving %s: %s", labelVcfaOrg, err) + } + + d.SetId(org.TmOrg.ID) + dSet(d, "org_id", org.TmOrg.ID) + + orgNetworkingSettings, err := getTmOrgNetworkingSettingsType(vcfaClient, d) + if err != nil { + return diag.FromErr(err) + } + + _, err = org.UpdateOrgNetworkingSettings(orgNetworkingSettings) + if err != nil { + return diag.Errorf("error updating %s for %s:%s", labelVcfaOrgNetworking, labelVcfaOrg, err) + } + + return resourceVcfaOrgNetworkingRead(ctx, d, meta) +} + +func resourceVcfaOrgNetworkingRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + vcfaClient := meta.(*VCDClient) + org, err := vcfaClient.GetTmOrgById(d.Get("org_id").(string)) + if err != nil { + return diag.Errorf("error retrieving %s: %s", labelVcfaOrg, err) + } + + d.SetId(org.TmOrg.ID) + dSet(d, "org_id", org.TmOrg.ID) + + orgNetworkingSettings, err := org.GetOrgNetworkingSettings() + if err != nil { + if govcd.ContainsNotFound(err) { // Org no longer present, removing from state + d.SetId("") + return nil + } + return diag.Errorf("error retrieving %s for %s:%s", labelVcfaOrgNetworking, labelVcfaOrg, err) + } + + err = setTmOrgNetworkingSettingsData(vcfaClient, d, orgNetworkingSettings) + if err != nil { + return diag.Errorf("error storing read %s: %s", labelVcfaOrgNetworking, err) + } + + return nil +} + +func resourceVcfaOrgNetworkingDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + vcfaClient := meta.(*VCDClient) + org, err := vcfaClient.GetTmOrgById(d.Get("org_id").(string)) + if err != nil { + return diag.Errorf("error retrieving %s: %s", labelVcfaOrg, err) + } + + // reset settings + resetSettings := &types.TmOrgNetworkingSettings{ + OrgNameForLogs: "", + } + + _, err = org.UpdateOrgNetworkingSettings(resetSettings) + if err != nil { + return diag.Errorf("error removing Org Network Settings: %s", err) + } + + return nil +} + +func resourceVcfaOrgNetworkingImport(ctx context.Context, d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { + vcdClient := meta.(*VCDClient) + + o, err := vcdClient.GetTmOrgByName(d.Id()) + if err != nil { + return nil, fmt.Errorf("error getting Org: %s", err) + } + + dSet(d, "org_id", o.TmOrg.ID) + d.SetId(o.TmOrg.ID) + return []*schema.ResourceData{d}, nil +} + +func getTmOrgNetworkingSettingsType(_ *VCDClient, d *schema.ResourceData) (*types.TmOrgNetworkingSettings, error) { + t := &types.TmOrgNetworkingSettings{ + OrgNameForLogs: d.Get("log_name").(string), + // No setting for it in UI + // NetworkingTenancyEnabled: addrOf(d.Get("networking_tenancy_enabled").(bool)), + } + + return t, nil +} + +func setTmOrgNetworkingSettingsData(_ *VCDClient, d *schema.ResourceData, orgNetConfig *types.TmOrgNetworkingSettings) error { + dSet(d, "log_name", orgNetConfig.OrgNameForLogs) + if orgNetConfig.NetworkingTenancyEnabled != nil { + dSet(d, "networking_tenancy_enabled", *orgNetConfig.NetworkingTenancyEnabled) + } + return nil +} diff --git a/vcfa/resource_vcfa_org_networking_test.go b/vcfa/resource_vcfa_org_networking_test.go new file mode 100644 index 00000000..8a2e351b --- /dev/null +++ b/vcfa/resource_vcfa_org_networking_test.go @@ -0,0 +1,104 @@ +//go:build org || tm || ALL || functional + +package vcfa + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func TestAccVcfaOrgNetworking(t *testing.T) { + preTestChecks(t) + skipIfNotSysAdmin(t) + + var params = StringMap{ + "Testname": t.Name(), + "Tags": "tm org", + } + testParamsNotEmpty(t, params) + + configText1 := templateFill(testAccVcfaOrgNetworkingStep1, params) + params["FuncName"] = t.Name() + "-step2" + configText2 := templateFill(testAccVcfaOrgNetworkingStep2, params) + params["FuncName"] = t.Name() + "-step3" + configText3 := templateFill(testAccVcfaOrgNetworkingStep3DS, params) + + debugPrintf("#[DEBUG] CONFIGURATION step1: %s\n", configText1) + debugPrintf("#[DEBUG] CONFIGURATION step2: %s\n", configText2) + debugPrintf("#[DEBUG] CONFIGURATION step3: %s\n", configText3) + if vcfaShortTest { + t.Skip(acceptanceTestsSkipped) + return + } + + resource.Test(t, resource.TestCase{ + ProviderFactories: testAccProviders, + Steps: []resource.TestStep{ + { + Config: configText1, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("vcfa_org.test", "name", t.Name()), + resource.TestCheckResourceAttrPair("vcfa_org.test", "id", "vcfa_org_networking.test", "id"), + resource.TestCheckResourceAttr("vcfa_org_networking.test", "log_name", "l-one"), + ), + }, + { + Config: configText2, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("vcfa_org.test", "name", t.Name()+"-updated"), + resource.TestCheckResourceAttrPair("vcfa_org.test", "id", "vcfa_org_networking.test", "id"), + resource.TestCheckResourceAttr("vcfa_org_networking.test", "log_name", "l-one-u"), + ), + }, + { + Config: configText3, + Check: resource.ComposeTestCheckFunc( + resourceFieldsEqual("vcfa_org_networking.test", "data.vcfa_org_networking.test", nil), + ), + }, + { + ResourceName: "vcfa_org_networking.test", + ImportState: true, + ImportStateVerify: true, + ImportStateId: params["Testname"].(string), // Org name + }, + }, + }) + + postTestChecks(t) +} + +const testAccVcfaOrgNetworkingStep1 = ` +resource "vcfa_org" "test" { + name = "{{.Testname}}" + display_name = "terraform-test" + description = "terraform test" + is_enabled = true +} + +resource "vcfa_org_networking" "test" { + org_id = vcfa_org.test.id + log_name = "l-one" +} +` + +const testAccVcfaOrgNetworkingStep2 = ` +resource "vcfa_org" "test" { + name = "{{.Testname}}-updated" + display_name = "terraform-test" + description = "" + is_enabled = false +} + +resource "vcfa_org_networking" "test" { + org_id = vcfa_org.test.id + log_name = "l-one-u" +} +` + +const testAccVcfaOrgNetworkingStep3DS = testAccVcfaOrgNetworkingStep2 + ` +data "vcfa_org_networking" "test" { + org_id = vcfa_org.test.id +} +` diff --git a/vcfa/structure.go b/vcfa/structure.go index d145e408..8dff2b7b 100644 --- a/vcfa/structure.go +++ b/vcfa/structure.go @@ -40,6 +40,14 @@ func convertTypeListToSliceOfStrings(param []interface{}) []string { return result } +// addrOf is a generic function to return the address of a variable +// Note. It is mainly meant for converting literal values to pointers (e.g. `addrOf(true)`) or cases +// for converting variables coming out straight from Terraform schema (e.g. +// `addrOf(d.Get("name").(string))`). +func addrOf[T any](variable T) *T { + return &variable +} + // extractIdsFromOpenApiReferences extracts []string with IDs from []types.OpenApiReference which contains ID and Names func extractIdsFromOpenApiReferences(refs []types.OpenApiReference) []string { resultStrings := make([]string, len(refs)) diff --git a/website/docs/d/org_networking.html.markdown b/website/docs/d/org_networking.html.markdown new file mode 100644 index 00000000..5ba3388b --- /dev/null +++ b/website/docs/d/org_networking.html.markdown @@ -0,0 +1,35 @@ +--- +layout: "vcfa" +page_title: "VMware Cloud Foundation Automation: vcfa_org_networking" +sidebar_current: "docs-vcfa-data-source-org-networking" +description: |- + Provides a data source to read VMware Cloud Foundation Automation Organization Networking Settings. +--- + +# vcfa\_org\_networking + +Provides a data source to read VMware Cloud Foundation Automation Organization Networking Settings. + +## Example Usage + +```hcl +data "vcfa_org" "demo" { + name = "my-org-name" +} + +data "vcfa_org_networking" "demo" { + org_id = data.vcfa_org.demo.id +} +``` + +## Argument Reference + +The following arguments are supported: + +- `org_id` - (Required) The ID of Organization. + +## Attribute Reference + +All the arguments and attributes defined in +[`vcfa_org_networking`](/providers/vmware/vcfa/latest/docs/resources/org_networking) resource are +available. \ No newline at end of file diff --git a/website/docs/r/org_networking.html.markdown b/website/docs/r/org_networking.html.markdown new file mode 100644 index 00000000..a76293d6 --- /dev/null +++ b/website/docs/r/org_networking.html.markdown @@ -0,0 +1,57 @@ +--- +layout: "vcfa" +page_title: "VMware Cloud Foundation Automation: vcfa_org_networking" +sidebar_current: "docs-vcfa-resource-org-networking" +description: |- + Provides a resource to manage VMware Cloud Foundation Automation Organization Networking Settings. +--- + +# vcfa\_org\_networking + +Provides a resource to manage VMware Cloud Foundation Automation Organization Networking Settings. + +## Example Usage + +```hcl +data "vcfa_org" "demo" { + name = "my-org-name" +} + +resource "vcfa_org_networking" "demo" { + org_id = data.vcfa_org.demo.id + +} +``` + +## Argument Reference + +The following arguments are supported: + +- `org_id` - (Required) An Organization ID for which the networking settings are to be changed +- `log_name` - (Required) A globally unique identifier for this Organization in the logs of the + backing network provider. Must be 1-8 chars length. + + +## Attribute Reference + +The following attributes are exported on this resource: + +- `networking_tenancy_enabled` - Whether this Organization has tenancy for the network domain in the + backing network provider + +## Importing + +~> **Note:** The current implementation of Terraform import can only import resources into the +state. It does not generate configuration. However, an experimental feature in Terraform 1.5+ allows +also code generation. See [Importing resources][importing-resources] for more information. + +An existing Org configuration can be [imported][docs-import] into this resource via supplying path +for it. An example is below: + +[docs-import]: https://www.terraform.io/docs/import/ + +``` +terraform import vcfa_org_networking.imported my-org-name +``` + +The above would import the `my-org-name` Organization Networking settings. \ No newline at end of file diff --git a/website/vcfa.erb b/website/vcfa.erb index 87fc7a94..4194447e 100644 --- a/website/vcfa.erb +++ b/website/vcfa.erb @@ -75,6 +75,9 @@ > vcfa_edge_cluster_qos + > + vcfa_org_networking + > @@ -110,6 +113,9 @@ > vcfa_edge_cluster_qos + > + vcfa_org_networking + From 73294fdb751e1978e09cd615634f92313b43cf36 Mon Sep 17 00:00:00 2001 From: Dainius Date: Mon, 27 Jan 2025 12:56:45 +0200 Subject: [PATCH 2/7] Patch test, changelog Signed-off-by: Dainius --- .changes/v1.0.0/15-features.md | 2 ++ vcfa/resource_vcfa_org_networking_test.go | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 .changes/v1.0.0/15-features.md diff --git a/.changes/v1.0.0/15-features.md b/.changes/v1.0.0/15-features.md new file mode 100644 index 00000000..f52f21ab --- /dev/null +++ b/.changes/v1.0.0/15-features.md @@ -0,0 +1,2 @@ +- **New Resource:** `vcfa_org_networking` to manage Org Networking Settings [GH-15] +- **New Data Source:** `vcfa_org_networking` to read Org Networking Settings [GH-15] diff --git a/vcfa/resource_vcfa_org_networking_test.go b/vcfa/resource_vcfa_org_networking_test.go index 8a2e351b..17060199 100644 --- a/vcfa/resource_vcfa_org_networking_test.go +++ b/vcfa/resource_vcfa_org_networking_test.go @@ -51,18 +51,18 @@ func TestAccVcfaOrgNetworking(t *testing.T) { resource.TestCheckResourceAttr("vcfa_org_networking.test", "log_name", "l-one-u"), ), }, - { - Config: configText3, - Check: resource.ComposeTestCheckFunc( - resourceFieldsEqual("vcfa_org_networking.test", "data.vcfa_org_networking.test", nil), - ), - }, { ResourceName: "vcfa_org_networking.test", ImportState: true, ImportStateVerify: true, ImportStateId: params["Testname"].(string), // Org name }, + { + Config: configText3, + Check: resource.ComposeTestCheckFunc( + resourceFieldsEqual("vcfa_org_networking.test", "data.vcfa_org_networking.test", nil), + ), + }, }, }) From c5a8d9f6e2caab5130cf12a3b17ea9bc31a17741 Mon Sep 17 00:00:00 2001 From: Dainius Date: Mon, 27 Jan 2025 13:09:05 +0200 Subject: [PATCH 3/7] Self review, tests Signed-off-by: Dainius --- vcfa/resource_vcfa_org_networking.go | 2 +- vcfa/resource_vcfa_org_networking_test.go | 40 ++++++++++++++++----- website/docs/r/org_networking.html.markdown | 1 - 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/vcfa/resource_vcfa_org_networking.go b/vcfa/resource_vcfa_org_networking.go index 10e38e60..63028542 100644 --- a/vcfa/resource_vcfa_org_networking.go +++ b/vcfa/resource_vcfa_org_networking.go @@ -34,7 +34,7 @@ func resourceVcfaOrgNetworking() *schema.Resource { Type: schema.TypeString, Required: true, Description: fmt.Sprintf("A globally unique identifier (max 8 char) for this %s in the logs of the backing network provider", labelVcfaOrg), - ValidateDiagFunc: validation.ToDiagFunc(validation.StringLenBetween(1, 8)), + ValidateDiagFunc: validation.ToDiagFunc(validation.StringLenBetween(0, 8)), }, "networking_tenancy_enabled": { Type: schema.TypeBool, diff --git a/vcfa/resource_vcfa_org_networking_test.go b/vcfa/resource_vcfa_org_networking_test.go index 17060199..0a2b70ac 100644 --- a/vcfa/resource_vcfa_org_networking_test.go +++ b/vcfa/resource_vcfa_org_networking_test.go @@ -22,11 +22,13 @@ func TestAccVcfaOrgNetworking(t *testing.T) { params["FuncName"] = t.Name() + "-step2" configText2 := templateFill(testAccVcfaOrgNetworkingStep2, params) params["FuncName"] = t.Name() + "-step3" - configText3 := templateFill(testAccVcfaOrgNetworkingStep3DS, params) + configText3 := templateFill(testAccVcfaOrgNetworkingStep3, params) + params["FuncName"] = t.Name() + "-step4" + configText4 := templateFill(testAccVcfaOrgNetworkingStep4DS, params) debugPrintf("#[DEBUG] CONFIGURATION step1: %s\n", configText1) - debugPrintf("#[DEBUG] CONFIGURATION step2: %s\n", configText2) - debugPrintf("#[DEBUG] CONFIGURATION step3: %s\n", configText3) + debugPrintf("#[DEBUG] CONFIGURATION step2: %s\n", configText3) + debugPrintf("#[DEBUG] CONFIGURATION step3: %s\n", configText4) if vcfaShortTest { t.Skip(acceptanceTestsSkipped) return @@ -46,7 +48,15 @@ func TestAccVcfaOrgNetworking(t *testing.T) { { Config: configText2, Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr("vcfa_org.test", "name", t.Name()+"-updated"), + resource.TestCheckResourceAttr("vcfa_org.test", "name", t.Name()), + resource.TestCheckResourceAttrPair("vcfa_org.test", "id", "vcfa_org_networking.test", "id"), + resource.TestCheckResourceAttr("vcfa_org_networking.test", "log_name", ""), + ), + }, + { + Config: configText3, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr("vcfa_org.test", "name", t.Name()+""), resource.TestCheckResourceAttrPair("vcfa_org.test", "id", "vcfa_org_networking.test", "id"), resource.TestCheckResourceAttr("vcfa_org_networking.test", "log_name", "l-one-u"), ), @@ -58,7 +68,7 @@ func TestAccVcfaOrgNetworking(t *testing.T) { ImportStateId: params["Testname"].(string), // Org name }, { - Config: configText3, + Config: configText4, Check: resource.ComposeTestCheckFunc( resourceFieldsEqual("vcfa_org_networking.test", "data.vcfa_org_networking.test", nil), ), @@ -85,10 +95,24 @@ resource "vcfa_org_networking" "test" { const testAccVcfaOrgNetworkingStep2 = ` resource "vcfa_org" "test" { - name = "{{.Testname}}-updated" + name = "{{.Testname}}" + display_name = "terraform-test" + description = "" + is_enabled = true +} + +resource "vcfa_org_networking" "test" { + org_id = vcfa_org.test.id + log_name = "" +} +` + +const testAccVcfaOrgNetworkingStep3 = ` +resource "vcfa_org" "test" { + name = "{{.Testname}}" display_name = "terraform-test" description = "" - is_enabled = false + is_enabled = true } resource "vcfa_org_networking" "test" { @@ -97,7 +121,7 @@ resource "vcfa_org_networking" "test" { } ` -const testAccVcfaOrgNetworkingStep3DS = testAccVcfaOrgNetworkingStep2 + ` +const testAccVcfaOrgNetworkingStep4DS = testAccVcfaOrgNetworkingStep3 + ` data "vcfa_org_networking" "test" { org_id = vcfa_org.test.id } diff --git a/website/docs/r/org_networking.html.markdown b/website/docs/r/org_networking.html.markdown index a76293d6..f214314c 100644 --- a/website/docs/r/org_networking.html.markdown +++ b/website/docs/r/org_networking.html.markdown @@ -19,7 +19,6 @@ data "vcfa_org" "demo" { resource "vcfa_org_networking" "demo" { org_id = data.vcfa_org.demo.id - } ``` From 4925f9e677b5eb255eb6d1af9c0f1f6520d35b57 Mon Sep 17 00:00:00 2001 From: Dainius Date: Mon, 27 Jan 2025 13:09:38 +0200 Subject: [PATCH 4/7] Latest govcd Signed-off-by: Dainius --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f7582886..0590054f 100644 --- a/go.mod +++ b/go.mod @@ -67,4 +67,4 @@ require ( sigs.k8s.io/yaml v1.4.0 // indirect ) -replace github.com/vmware/go-vcloud-director/v3 => github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127104832-feb6cd1b5d8b +replace github.com/vmware/go-vcloud-director/v3 => github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127110854-6e2af1ae07dd diff --git a/go.sum b/go.sum index 954fff7c..cbf3be71 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127104832-feb6cd1b5d8b h1:dcMNHd3eG8m4MBrOKdwLQJ55a25+dq2uTlPT3/Wxz1Q= -github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127104832-feb6cd1b5d8b/go.mod h1:68KHsVns52dsq/w5JQYzauaU/+NAi1FmCxhBrFc/VoQ= +github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127110854-6e2af1ae07dd h1:9wVAkMLkU3cR01evLuNuwdB7bJp3I9FltPTtoj33eUU= +github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127110854-6e2af1ae07dd/go.mod h1:68KHsVns52dsq/w5JQYzauaU/+NAi1FmCxhBrFc/VoQ= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/ProtonMail/go-crypto v1.1.0-alpha.2 h1:bkyFVUP+ROOARdgCiJzNQo2V2kiB97LyUpzH9P6Hrlg= From 16ae54d0ec15b6324d940434d38d347e99c58ec6 Mon Sep 17 00:00:00 2001 From: Dainius Date: Mon, 27 Jan 2025 13:12:06 +0200 Subject: [PATCH 5/7] make static Signed-off-by: Dainius --- vcfa/structure.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/vcfa/structure.go b/vcfa/structure.go index 8dff2b7b..d145e408 100644 --- a/vcfa/structure.go +++ b/vcfa/structure.go @@ -40,14 +40,6 @@ func convertTypeListToSliceOfStrings(param []interface{}) []string { return result } -// addrOf is a generic function to return the address of a variable -// Note. It is mainly meant for converting literal values to pointers (e.g. `addrOf(true)`) or cases -// for converting variables coming out straight from Terraform schema (e.g. -// `addrOf(d.Get("name").(string))`). -func addrOf[T any](variable T) *T { - return &variable -} - // extractIdsFromOpenApiReferences extracts []string with IDs from []types.OpenApiReference which contains ID and Names func extractIdsFromOpenApiReferences(refs []types.OpenApiReference) []string { resultStrings := make([]string, len(refs)) From c997b04a20031e4c4343d35ad3390596e50dcff3 Mon Sep 17 00:00:00 2001 From: Dainius Date: Mon, 27 Jan 2025 17:47:40 +0200 Subject: [PATCH 6/7] go mod Signed-off-by: Dainius --- go.mod | 4 +--- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 0590054f..23c9140b 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.22.3 require ( github.com/hashicorp/go-version v1.7.0 github.com/hashicorp/terraform-plugin-sdk/v2 v2.35.0 - github.com/vmware/go-vcloud-director/v3 v3.0.0-alpha.19 + github.com/vmware/go-vcloud-director/v3 v3.0.0-alpha.21 ) require ( @@ -66,5 +66,3 @@ require ( google.golang.org/protobuf v1.35.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) - -replace github.com/vmware/go-vcloud-director/v3 => github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127110854-6e2af1ae07dd diff --git a/go.sum b/go.sum index cbf3be71..8c5471c1 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127110854-6e2af1ae07dd h1:9wVAkMLkU3cR01evLuNuwdB7bJp3I9FltPTtoj33eUU= -github.com/Didainius/go-vcloud-director/v3 v3.0.0-alpha.4.0.20250127110854-6e2af1ae07dd/go.mod h1:68KHsVns52dsq/w5JQYzauaU/+NAi1FmCxhBrFc/VoQ= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/ProtonMail/go-crypto v1.1.0-alpha.2 h1:bkyFVUP+ROOARdgCiJzNQo2V2kiB97LyUpzH9P6Hrlg= @@ -151,6 +149,8 @@ github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IU github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/vmware/go-vcloud-director/v3 v3.0.0-alpha.21 h1:iBuyJ9Vq8ydyHaFiD3eUnEz7OkbqhDv5OXWI/fOCtPs= +github.com/vmware/go-vcloud-director/v3 v3.0.0-alpha.21/go.mod h1:68KHsVns52dsq/w5JQYzauaU/+NAi1FmCxhBrFc/VoQ= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= From 8e479f4f5d15d87c0fbfb0437457e79ba5f50d15 Mon Sep 17 00:00:00 2001 From: Dainius Date: Mon, 27 Jan 2025 17:51:45 +0200 Subject: [PATCH 7/7] Address comments Signed-off-by: Dainius --- vcfa/datasource_vcfa_org_networking.go | 2 +- vcfa/resource_vcfa_org_networking.go | 10 +++++----- vcfa/resource_vcfa_org_networking_test.go | 5 +++-- website/docs/r/org_networking.html.markdown | 3 ++- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/vcfa/datasource_vcfa_org_networking.go b/vcfa/datasource_vcfa_org_networking.go index a4fd34e1..0950ca6d 100644 --- a/vcfa/datasource_vcfa_org_networking.go +++ b/vcfa/datasource_vcfa_org_networking.go @@ -48,7 +48,7 @@ func datasourceVcfaOrgNetworkingRead(ctx context.Context, d *schema.ResourceData return diag.Errorf("error retrieving %s for %s:%s", labelVcfaOrgNetworking, labelVcfaOrg, err) } - err = setTmOrgNetworkingSettingsData(vcfaClient, d, orgNetworkingSettings) + err = setOrgNetworkingSettingsData(vcfaClient, d, orgNetworkingSettings) if err != nil { return diag.Errorf("error storing read %s: %s", labelVcfaOrgNetworking, err) } diff --git a/vcfa/resource_vcfa_org_networking.go b/vcfa/resource_vcfa_org_networking.go index 63028542..f7440b62 100644 --- a/vcfa/resource_vcfa_org_networking.go +++ b/vcfa/resource_vcfa_org_networking.go @@ -39,7 +39,7 @@ func resourceVcfaOrgNetworking() *schema.Resource { "networking_tenancy_enabled": { Type: schema.TypeBool, Computed: true, - Description: "Whether this Organization has tenancy for the network domain in the backing network provider", + Description: fmt.Sprintf("Whether this %s has tenancy for the network domain in the backing network provider", labelVcfaOrg), }, }, } @@ -56,7 +56,7 @@ func resourceVcfaOrgNetworkingCreateUpdate(ctx context.Context, d *schema.Resour d.SetId(org.TmOrg.ID) dSet(d, "org_id", org.TmOrg.ID) - orgNetworkingSettings, err := getTmOrgNetworkingSettingsType(vcfaClient, d) + orgNetworkingSettings, err := getOrgNetworkingSettingsType(vcfaClient, d) if err != nil { return diag.FromErr(err) } @@ -88,7 +88,7 @@ func resourceVcfaOrgNetworkingRead(ctx context.Context, d *schema.ResourceData, return diag.Errorf("error retrieving %s for %s:%s", labelVcfaOrgNetworking, labelVcfaOrg, err) } - err = setTmOrgNetworkingSettingsData(vcfaClient, d, orgNetworkingSettings) + err = setOrgNetworkingSettingsData(vcfaClient, d, orgNetworkingSettings) if err != nil { return diag.Errorf("error storing read %s: %s", labelVcfaOrgNetworking, err) } @@ -129,7 +129,7 @@ func resourceVcfaOrgNetworkingImport(ctx context.Context, d *schema.ResourceData return []*schema.ResourceData{d}, nil } -func getTmOrgNetworkingSettingsType(_ *VCDClient, d *schema.ResourceData) (*types.TmOrgNetworkingSettings, error) { +func getOrgNetworkingSettingsType(_ *VCDClient, d *schema.ResourceData) (*types.TmOrgNetworkingSettings, error) { t := &types.TmOrgNetworkingSettings{ OrgNameForLogs: d.Get("log_name").(string), // No setting for it in UI @@ -139,7 +139,7 @@ func getTmOrgNetworkingSettingsType(_ *VCDClient, d *schema.ResourceData) (*type return t, nil } -func setTmOrgNetworkingSettingsData(_ *VCDClient, d *schema.ResourceData, orgNetConfig *types.TmOrgNetworkingSettings) error { +func setOrgNetworkingSettingsData(_ *VCDClient, d *schema.ResourceData, orgNetConfig *types.TmOrgNetworkingSettings) error { dSet(d, "log_name", orgNetConfig.OrgNameForLogs) if orgNetConfig.NetworkingTenancyEnabled != nil { dSet(d, "networking_tenancy_enabled", *orgNetConfig.NetworkingTenancyEnabled) diff --git a/vcfa/resource_vcfa_org_networking_test.go b/vcfa/resource_vcfa_org_networking_test.go index 0a2b70ac..80294eed 100644 --- a/vcfa/resource_vcfa_org_networking_test.go +++ b/vcfa/resource_vcfa_org_networking_test.go @@ -27,8 +27,9 @@ func TestAccVcfaOrgNetworking(t *testing.T) { configText4 := templateFill(testAccVcfaOrgNetworkingStep4DS, params) debugPrintf("#[DEBUG] CONFIGURATION step1: %s\n", configText1) - debugPrintf("#[DEBUG] CONFIGURATION step2: %s\n", configText3) - debugPrintf("#[DEBUG] CONFIGURATION step3: %s\n", configText4) + debugPrintf("#[DEBUG] CONFIGURATION step2: %s\n", configText2) + debugPrintf("#[DEBUG] CONFIGURATION step3: %s\n", configText3) + debugPrintf("#[DEBUG] CONFIGURATION step4: %s\n", configText4) if vcfaShortTest { t.Skip(acceptanceTestsSkipped) return diff --git a/website/docs/r/org_networking.html.markdown b/website/docs/r/org_networking.html.markdown index f214314c..179170f0 100644 --- a/website/docs/r/org_networking.html.markdown +++ b/website/docs/r/org_networking.html.markdown @@ -18,7 +18,8 @@ data "vcfa_org" "demo" { } resource "vcfa_org_networking" "demo" { - org_id = data.vcfa_org.demo.id + org_id = data.vcfa_org.demo.id + log_name = "org1" } ```