Skip to content

Commit

Permalink
New Resource: azurerm_dev_center_attached_network (hashicorp#27638)
Browse files Browse the repository at this point in the history
* New Resource: azurerm_dev_center_attached_network

* update registration

* update tc
  • Loading branch information
neil-yechenwei authored Oct 17, 2024
1 parent 82e263d commit 3cb3573
Show file tree
Hide file tree
Showing 4 changed files with 391 additions and 0 deletions.
161 changes: 161 additions & 0 deletions internal/services/devcenter/dev_center_attached_network_resource.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package devcenter

import (
"context"
"fmt"
"time"

"github.com/hashicorp/go-azure-helpers/lang/response"
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonschema"
"github.com/hashicorp/go-azure-sdk/resource-manager/devcenter/2023-04-01/attachednetworkconnections"
"github.com/hashicorp/go-azure-sdk/resource-manager/devcenter/2023-04-01/devcenters"
"github.com/hashicorp/go-azure-sdk/resource-manager/devcenter/2023-04-01/networkconnections"
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation"
)

var _ sdk.Resource = DevCenterAttachedNetworkResource{}

type DevCenterAttachedNetworkResource struct{}

func (r DevCenterAttachedNetworkResource) ModelObject() interface{} {
return &DevCenterAttachedNetworkResourceModel{}
}

type DevCenterAttachedNetworkResourceModel struct {
Name string `tfschema:"name"`
DevCenterId string `tfschema:"dev_center_id"`
NetworkConnectionId string `tfschema:"network_connection_id"`
}

func (r DevCenterAttachedNetworkResource) IDValidationFunc() pluginsdk.SchemaValidateFunc {
return attachednetworkconnections.ValidateDevCenterAttachedNetworkID
}

func (r DevCenterAttachedNetworkResource) ResourceType() string {
return "azurerm_dev_center_attached_network"
}

func (r DevCenterAttachedNetworkResource) Arguments() map[string]*pluginsdk.Schema {
return map[string]*pluginsdk.Schema{
"name": {
Type: pluginsdk.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validation.StringIsNotEmpty,
},

"dev_center_id": commonschema.ResourceIDReferenceRequiredForceNew(&devcenters.DevCenterId{}),

"network_connection_id": commonschema.ResourceIDReferenceRequiredForceNew(&networkconnections.NetworkConnectionId{}),
}
}

func (r DevCenterAttachedNetworkResource) Attributes() map[string]*pluginsdk.Schema {
return map[string]*pluginsdk.Schema{}
}

func (r DevCenterAttachedNetworkResource) Create() sdk.ResourceFunc {
return sdk.ResourceFunc{
Timeout: 30 * time.Minute,
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
client := metadata.Client.DevCenter.V20230401.AttachedNetworkConnections
subscriptionId := metadata.Client.Account.SubscriptionId

var model DevCenterAttachedNetworkResourceModel
if err := metadata.Decode(&model); err != nil {
return fmt.Errorf("decoding: %+v", err)
}

devCenterId, err := devcenters.ParseDevCenterID(model.DevCenterId)
if err != nil {
return err
}

id := attachednetworkconnections.NewDevCenterAttachedNetworkID(subscriptionId, devCenterId.ResourceGroupName, devCenterId.DevCenterName, model.Name)

existing, err := client.AttachedNetworksGetByDevCenter(ctx, id)
if err != nil {
if !response.WasNotFound(existing.HttpResponse) {
return fmt.Errorf("checking for the presence of an existing %s: %+v", id, err)
}
}

if !response.WasNotFound(existing.HttpResponse) {
return metadata.ResourceRequiresImport(r.ResourceType(), id)
}

parameters := attachednetworkconnections.AttachedNetworkConnection{
Properties: &attachednetworkconnections.AttachedNetworkConnectionProperties{
NetworkConnectionId: model.NetworkConnectionId,
},
}

if err := client.AttachedNetworksCreateOrUpdateThenPoll(ctx, id, parameters); err != nil {
return fmt.Errorf("creating %s: %+v", id, err)
}

metadata.SetID(id)
return nil
},
}
}

func (r DevCenterAttachedNetworkResource) Read() sdk.ResourceFunc {
return sdk.ResourceFunc{
Timeout: 5 * time.Minute,
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
client := metadata.Client.DevCenter.V20230401.AttachedNetworkConnections

id, err := attachednetworkconnections.ParseDevCenterAttachedNetworkID(metadata.ResourceData.Id())
if err != nil {
return err
}

resp, err := client.AttachedNetworksGetByDevCenter(ctx, *id)
if err != nil {
if response.WasNotFound(resp.HttpResponse) {
return metadata.MarkAsGone(*id)
}
return fmt.Errorf("retrieving %s: %+v", *id, err)
}

state := DevCenterAttachedNetworkResourceModel{
Name: id.AttachedNetworkName,
DevCenterId: attachednetworkconnections.NewDevCenterID(id.SubscriptionId, id.ResourceGroupName, id.DevCenterName).ID(),
}

if model := resp.Model; model != nil {
if props := model.Properties; props != nil {
state.NetworkConnectionId = props.NetworkConnectionId
}
}

return metadata.Encode(&state)
},
}
}

func (r DevCenterAttachedNetworkResource) Delete() sdk.ResourceFunc {
return sdk.ResourceFunc{
Timeout: 30 * time.Minute,
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
client := metadata.Client.DevCenter.V20230401.AttachedNetworkConnections

id, err := attachednetworkconnections.ParseDevCenterAttachedNetworkID(metadata.ResourceData.Id())
if err != nil {
return err
}

if err := client.AttachedNetworksDeleteThenPoll(ctx, *id); err != nil {
return fmt.Errorf("deleting %s: %+v", *id, err)
}

return nil
},
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

package devcenter_test

import (
"context"
"fmt"
"testing"

"github.com/hashicorp/go-azure-helpers/lang/pointer"
"github.com/hashicorp/go-azure-sdk/resource-manager/devcenter/2023-04-01/attachednetworkconnections"
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance"
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/check"
"github.com/hashicorp/terraform-provider-azurerm/internal/clients"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
)

type DevCenterAttachedNetworkTestResource struct{}

func TestAccDevCenterAttachedNetwork_basic(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_dev_center_attached_network", "test")
r := DevCenterAttachedNetworkTestResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.basic(data),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.ImportStep(),
})
}

func TestAccDevCenterAttachedNetwork_requiresImport(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_dev_center_attached_network", "test")
r := DevCenterAttachedNetworkTestResource{}

data.ResourceTest(t, r, []acceptance.TestStep{
{
Config: r.basic(data),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).ExistsInAzure(r),
),
},
data.RequiresImportErrorStep(r.requiresImport),
})
}

func (r DevCenterAttachedNetworkTestResource) Exists(ctx context.Context, clients *clients.Client, state *pluginsdk.InstanceState) (*bool, error) {
id, err := attachednetworkconnections.ParseDevCenterAttachedNetworkID(state.ID)
if err != nil {
return nil, err
}

resp, err := clients.DevCenter.V20230401.AttachedNetworkConnections.AttachedNetworksGetByDevCenter(ctx, *id)
if err != nil {
return nil, fmt.Errorf("retrieving %s: %+v", *id, err)
}

return pointer.To(resp.Model != nil), nil
}

func (r DevCenterAttachedNetworkTestResource) basic(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
provider "azurerm" {
features {}
}
resource "azurerm_dev_center_attached_network" "test" {
name = "acctest-dcet-%d"
dev_center_id = azurerm_dev_center.test.id
network_connection_id = azurerm_dev_center_network_connection.test.id
}
`, r.template(data), data.RandomInteger)
}

func (r DevCenterAttachedNetworkTestResource) requiresImport(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
resource "azurerm_dev_center_attached_network" "import" {
name = azurerm_dev_center_attached_network.test.name
dev_center_id = azurerm_dev_center_attached_network.test.dev_center_id
network_connection_id = azurerm_dev_center_attached_network.test.network_connection_id
}
`, r.basic(data))
}

func (r DevCenterAttachedNetworkTestResource) template(data acceptance.TestData) string {
return fmt.Sprintf(`
resource "azurerm_resource_group" "test" {
name = "acctestrg-dcan-%d"
location = "%s"
}
resource "azurerm_virtual_network" "test" {
name = "acctest-vnet-%d"
address_space = ["10.0.0.0/16"]
location = azurerm_resource_group.test.location
resource_group_name = azurerm_resource_group.test.name
}
resource "azurerm_subnet" "test" {
name = "internal"
resource_group_name = azurerm_resource_group.test.name
virtual_network_name = azurerm_virtual_network.test.name
address_prefixes = ["10.0.2.0/24"]
}
resource "azurerm_dev_center" "test" {
name = "acctest-dc-%s"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
identity {
type = "SystemAssigned"
}
depends_on = [azurerm_subnet.test]
}
resource "azurerm_dev_center_network_connection" "test" {
name = "acctest-dcnc-%d"
resource_group_name = azurerm_resource_group.test.name
location = azurerm_resource_group.test.location
domain_join_type = "AzureADJoin"
subnet_id = azurerm_subnet.test.id
depends_on = [azurerm_dev_center.test]
}
`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, data.RandomString, data.RandomInteger)
}
1 change: 1 addition & 0 deletions internal/services/devcenter/registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ func (r Registration) DataSources() []sdk.DataSource {

func (r Registration) Resources() []sdk.Resource {
resources := []sdk.Resource{
DevCenterAttachedNetworkResource{},
DevCenterGalleryResource{},
DevCenterCatalogsResource{},
DevCenterDevBoxDefinitionResource{},
Expand Down
Loading

0 comments on commit 3cb3573

Please sign in to comment.