Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Resource: azurerm_mobile_network_slice; New Data Source: azurerm_mobile_network_slice #20336

Merged
merged 9 commits into from
Feb 14, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions internal/services/mobilenetwork/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,25 @@ package client

import (
"github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/mobilenetwork"
"github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/slice"
"github.com/hashicorp/terraform-provider-azurerm/internal/common"
)

type Client struct {
MobileNetworkClient *mobilenetwork.MobileNetworkClient
SliceClient *slice.SliceClient
}

func NewClient(o *common.ClientOptions) *Client {

mobileNetworkClient := mobilenetwork.NewMobileNetworkClientWithBaseURI(o.ResourceManagerEndpoint)
o.ConfigureClient(&mobileNetworkClient.Client, o.ResourceManagerAuthorizer)

sliceClient := slice.NewSliceClientWithBaseURI(o.ResourceManagerEndpoint)
o.ConfigureClient(&sliceClient.Client, o.ResourceManagerAuthorizer)

return &Client{
MobileNetworkClient: &mobileNetworkClient,
SliceClient: &sliceClient,
}
}
44 changes: 44 additions & 0 deletions internal/services/mobilenetwork/helpers.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package mobilenetwork

import (
"context"
"fmt"
"net/http"
"strconv"
"time"

"github.com/hashicorp/go-azure-helpers/lang/response"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
)

// a workaround for that some child resources may still exist for seconds before it fully deleted.
// it will cause the error "Can not delete resource before nested resources are deleted."
func resourceMobileNetworkChildWaitForDeletion(ctx context.Context, id string, getFunction func() (*http.Response, error)) error {
deadline, _ := ctx.Deadline()
stateConf := &pluginsdk.StateChangeConf{
Pending: []string{"200"},
Target: []string{"404"},
Refresh: func() (interface{}, string, error) {
resp, err := getFunction()
if err != nil {
if response.WasNotFound(resp) {
return resp, strconv.Itoa(resp.StatusCode), nil
}

return nil, strconv.Itoa(resp.StatusCode), fmt.Errorf("polling for %s: %+v", id, err)
}

return resp, strconv.Itoa(resp.StatusCode), nil
},
MinTimeout: 10 * time.Second,
PollInterval: 10 * time.Second,
ContinuousTargetOccurence: 6,
Timeout: time.Until(deadline),
}

if _, err := stateConf.WaitForStateContext(ctx); err != nil {
return fmt.Errorf("waiting for deleting %s: %+v", id, err)
ziyeqf marked this conversation as resolved.
Show resolved Hide resolved
}

return nil
}
138 changes: 138 additions & 0 deletions internal/services/mobilenetwork/mobile_network_slice_data_source.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
package mobilenetwork

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-helpers/resourcemanager/location"
"github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/mobilenetwork"
"github.com/hashicorp/go-azure-sdk/resource-manager/mobilenetwork/2022-11-01/slice"
"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"
)

type SliceDataSource struct{}

var _ sdk.DataSource = SliceDataSource{}

func (r SliceDataSource) ResourceType() string {
return "azurerm_mobile_network_slice"
}

func (r SliceDataSource) ModelObject() interface{} {
return &SliceModel{}
}

func (r SliceDataSource) IDValidationFunc() pluginsdk.SchemaValidateFunc {
return slice.ValidateSliceID
}

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

"mobile_network_id": {
Type: pluginsdk.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: mobilenetwork.ValidateMobileNetworkID,
},
ziyeqf marked this conversation as resolved.
Show resolved Hide resolved
}
}

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

"description": {
Type: pluginsdk.TypeString,
Computed: true,
},

"location": commonschema.LocationComputed(),

"single_network_slice_selection_assistance_information": {
Type: pluginsdk.TypeList,
Computed: true,

Elem: &pluginsdk.Resource{
Schema: map[string]*pluginsdk.Schema{
"slice_differentiator": {
Type: pluginsdk.TypeString,
Computed: true,
},

"slice_service_type": {
Type: pluginsdk.TypeInt,
Computed: true,
},
},
},
},

"tags": commonschema.TagsDataSource(),
}
}

func (r SliceDataSource) Read() sdk.ResourceFunc {
return sdk.ResourceFunc{
Timeout: 5 * time.Minute,
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error {
var metaModel SliceModel
if err := metadata.Decode(&metaModel); err != nil {
return fmt.Errorf("decoding: %+v", err)
}

client := metadata.Client.MobileNetwork.SliceClient
mobileNetworkId, err := mobilenetwork.ParseMobileNetworkID(metaModel.MobileNetworkMobileNetworkId)
if err != nil {
return err
}

id := slice.NewSliceID(mobileNetworkId.SubscriptionId, mobileNetworkId.ResourceGroupName, mobileNetworkId.MobileNetworkName, metaModel.Name)
ziyeqf marked this conversation as resolved.
Show resolved Hide resolved

resp, err := client.Get(ctx, id)
if err != nil {
if response.WasNotFound(resp.HttpResponse) {
return metadata.MarkAsGone(id)
}

return fmt.Errorf("retrieving %s: %+v", id, err)
}

model := resp.Model
if model == nil {
return fmt.Errorf("retrieving %s: model was nil", id)
}

state := SliceModel{
Name: id.SliceName,
MobileNetworkMobileNetworkId: mobilenetwork.NewMobileNetworkID(id.SubscriptionId, id.ResourceGroupName, id.MobileNetworkName).ID(),
Location: location.Normalize(model.Location),
}

properties := &model.Properties
if properties.Description != nil {
state.Description = *properties.Description
}

state.Snssai = flattenSnssaiModel(properties.Snssai)

if model.Tags != nil {
state.Tags = *model.Tags
}

metadata.SetID(id)

return metadata.Encode(&state)
},
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package mobilenetwork_test

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance"
"github.com/hashicorp/terraform-provider-azurerm/internal/acceptance/check"
)

type MobileNetworkSliceDataSource struct{}

func TestAccMobileNetworkSliceDataSource_complete(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_mobile_network_slice", "test")

// Limited regional availability for Mobile Network
data.Locations.Primary = "eastus"

d := MobileNetworkSliceDataSource{}
data.DataSourceTest(t, []acceptance.TestStep{
{
Config: d.complete(data),
Check: acceptance.ComposeTestCheckFunc(
check.That(data.ResourceName).Key(`location`).Exists(),
check.That(data.ResourceName).Key(`description`).HasValue("my favorite slice"),
check.That(data.ResourceName).Key(`single_network_slice_selection_assistance_information.0.slice_service_type`).HasValue("1"),
check.That(data.ResourceName).Key("tags.%").HasValue("1"),
),
},
})
}

func (r MobileNetworkSliceDataSource) complete(data acceptance.TestData) string {
return fmt.Sprintf(`
%s

data "azurerm_mobile_network_slice" "test" {
name = azurerm_mobile_network_slice.test.name
mobile_network_id = azurerm_mobile_network_slice.test.mobile_network_id
}
`, MobileNetworkSliceResource{}.complete(data))
}
Loading