Skip to content

Commit

Permalink
[network v2]: Add support for network segments update and import
Browse files Browse the repository at this point in the history
  • Loading branch information
kayrus committed Mar 9, 2023
1 parent 8727123 commit 223c0e7
Show file tree
Hide file tree
Showing 8 changed files with 82 additions and 9 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/terraform-provider-openstack/terraform-provider-openstack
go 1.20

require (
github.com/gophercloud/gophercloud v1.2.1-0.20230228142905-95364c20a5d5
github.com/gophercloud/gophercloud v1.2.1-0.20230309142102-36ac4a411ba7
github.com/gophercloud/utils v0.0.0-20220307143606-8e7800759d16
github.com/hashicorp/terraform-plugin-sdk/v2 v2.25.0
github.com/mitchellh/go-homedir v1.1.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gophercloud/gophercloud v0.20.0/go.mod h1:wRtmUelyIIv3CSSDI47aUwbs075O6i+LY+pXsKCBsb4=
github.com/gophercloud/gophercloud v1.2.1-0.20230228142905-95364c20a5d5 h1:DxZOHshqG2c4ST9QWBg4X5zgnMYKCmTjbIS+d+byvas=
github.com/gophercloud/gophercloud v1.2.1-0.20230228142905-95364c20a5d5/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM=
github.com/gophercloud/gophercloud v1.2.1-0.20230309142102-36ac4a411ba7 h1:wDr3jLA3vAtpH5DvqdTHtn34Uo15qA7F6EdEIJtm7+s=
github.com/gophercloud/gophercloud v1.2.1-0.20230309142102-36ac4a411ba7/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM=
github.com/gophercloud/utils v0.0.0-20220307143606-8e7800759d16 h1:slt/exMiitZNY+5OrKJ6ZvSogqN+SyzeYzAtyI6db9A=
github.com/gophercloud/utils v0.0.0-20220307143606-8e7800759d16/go.mod h1:qOGlfG6OIJ193/c3Xt/XjOfHataNZdQcVgiu93LxBUM=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
Expand Down
22 changes: 22 additions & 0 deletions openstack/data_source_openstack_networking_network_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,27 @@ func dataSourceNetworkingNetworkV2() *schema.Resource {
Elem: &schema.Schema{Type: schema.TypeString},
},

"segments": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"physical_network": {
Type: schema.TypeString,
Computed: true,
},
"network_type": {
Type: schema.TypeString,
Computed: true,
},
"segmentation_id": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},

"transparent_vlan": {
Type: schema.TypeBool,
Optional: true,
Expand Down Expand Up @@ -239,6 +260,7 @@ func dataSourceNetworkingNetworkV2Read(ctx context.Context, d *schema.ResourceDa
d.Set("shared", strconv.FormatBool(network.Shared))
d.Set("external", network.External)
d.Set("tenant_id", network.TenantID)
d.Set("segments", flattenNetworkingNetworkSegmentsV2(network))
d.Set("transparent_vlan", network.VLANTransparent)
d.Set("subnets", network.Subnets)
d.Set("all_tags", network.Tags)
Expand Down
2 changes: 1 addition & 1 deletion openstack/import_openstack_networking_network_v2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func TestAccNetworkingV2Network_importBasic(t *testing.T) {
CheckDestroy: testAccCheckNetworkingV2NetworkDestroy,
Steps: []resource.TestStep{
{
Config: testAccNetworkingV2NetworkBasic,
Config: testAccNetworkingV2NetworkMultipleSegmentMappings,
},

{
Expand Down
44 changes: 44 additions & 0 deletions openstack/networking_network_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package openstack

import (
"fmt"
"log"
"strconv"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
Expand Down Expand Up @@ -112,6 +114,16 @@ func resourceNetworkingNetworkV2StateRefreshFunc(client *gophercloud.ServiceClie
func expandNetworkingNetworkSegmentsV2(segments *schema.Set) []provider.Segment {
rawSegments := segments.List()

if len(rawSegments) == 1 {
// unset segments
rawMap := rawSegments[0].(map[string]interface{})
if rawMap["physical_network"] == "" &&
rawMap["network_type"] == "" &&
rawMap["segmentation_id"] == 0 {
return nil
}
}

providerSegments := make([]provider.Segment, len(rawSegments))
for i, raw := range rawSegments {
rawMap := raw.(map[string]interface{})
Expand All @@ -124,3 +136,35 @@ func expandNetworkingNetworkSegmentsV2(segments *schema.Set) []provider.Segment

return providerSegments
}

func flattenNetworkingNetworkSegmentsV2(network networkExtended) []map[string]interface{} {
singleSegment := 0
if network.NetworkType != "" ||
network.PhysicalNetwork != "" ||
network.SegmentationID != "" {
singleSegment = 1
}
segmentsSet := make([]map[string]interface{}, len(network.Segments)+singleSegment)

if singleSegment > 0 {
segmentationID, err := strconv.Atoi(network.SegmentationID)
if err != nil {
log.Printf("[DEBUG] Unable to convert %q segmentation ID to an integer: %s", network.SegmentationID, err)
}
segmentsSet[0] = map[string]interface{}{
"physical_network": network.PhysicalNetwork,
"network_type": network.NetworkType,
"segmentation_id": segmentationID,
}
}

for i, segment := range network.Segments {
segmentsSet[i+singleSegment] = map[string]interface{}{
"physical_network": segment.PhysicalNetwork,
"network_type": segment.NetworkType,
"segmentation_id": segment.SegmentationID,
}
}

return segmentsSet
}
14 changes: 10 additions & 4 deletions openstack/resource_openstack_networking_network_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,23 +88,20 @@ func resourceNetworkingNetworkV2() *schema.Resource {
"segments": {
Type: schema.TypeSet,
Optional: true,
ForceNew: true,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"physical_network": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"network_type": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
},
"segmentation_id": {
Type: schema.TypeInt,
Optional: true,
ForceNew: true,
},
},
},
Expand Down Expand Up @@ -326,6 +323,7 @@ func resourceNetworkingNetworkV2Read(ctx context.Context, d *schema.ResourceData
d.Set("shared", network.Shared)
d.Set("external", network.External)
d.Set("tenant_id", network.TenantID)
d.Set("segments", flattenNetworkingNetworkSegmentsV2(network))
d.Set("transparent_vlan", network.VLANTransparent)
d.Set("port_security_enabled", network.PortSecurityEnabled)
d.Set("mtu", network.MTU)
Expand Down Expand Up @@ -429,6 +427,14 @@ func resourceNetworkingNetworkV2Update(ctx context.Context, d *schema.ResourceDa
}
}

if d.HasChange("segments") {
segments := expandNetworkingNetworkSegmentsV2(d.Get("segments").(*schema.Set))
finalUpdateOpts = provider.UpdateOptsExt{
UpdateOptsBuilder: finalUpdateOpts,
Segments: &segments,
}
}

log.Printf("[DEBUG] openstack_networking_network_v2 %s update options: %#v", d.Id(), finalUpdateOpts)
_, err = networks.Update(networkingClient, d.Id(), finalUpdateOpts).Extract()
if err != nil {
Expand Down
2 changes: 1 addition & 1 deletion openstack/resource_openstack_networking_network_v2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -731,7 +731,7 @@ resource "openstack_networking_network_v2" "network_1" {
admin_state_up = "true"
segments {
segmentation_id = 2
segmentation_id = 2
network_type = "vxlan"
}
}
Expand Down
1 change: 1 addition & 0 deletions website/docs/d/networking_network_v2.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ are exported:
tenant or not.
* `availability_zone_hints` - The availability zone candidates for the network.
* `transparent_vlan` - See Argument Reference above.
* `segments` - An array of one or more provider segment objects.
* `mtu` - See Argument Reference above.
* `dns_domain` - The network DNS domain. Available, when Neutron DNS extension
is enabled
Expand Down

0 comments on commit 223c0e7

Please sign in to comment.