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_api_management_api_tag #14453 #14711

Merged
merged 21 commits into from
Jan 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
c6b571d
add generated files for ApiTag
meilz381 Dec 20, 2021
3588514
add resource for ApiTag Assignment
meilz381 Dec 21, 2021
1d5d1c0
Merge remote-tracking branch 'origin/main' into f/api_management_api_tag
meilz381 Dec 21, 2021
41bbce6
add acctest for api_management_api_tag
meilz381 Dec 22, 2021
a8fa5cc
update documentation api_management_api_tag
meilz381 Dec 22, 2021
3d50097
update documentation api_management_api_tag
meilz381 Dec 22, 2021
2ebd897
apply sugested changes, fix imports
meilz381 Dec 28, 2021
b5e71df
Merge remote-tracking branch 'origin/main' into f/api_management_api_tag
meilz381 Dec 28, 2021
c74dd8b
fix api_management_api_tag website formating
meilz381 Dec 28, 2021
e59e33c
fix api_management_api_tag acc test formating
meilz381 Dec 28, 2021
d76a08c
Merge branch 'hashicorp:main' into f/api_management_api_tag
meilz381 Dec 28, 2021
44e2681
Merge branch 'f/api_management_api_tag' of github.com:meilz381/terraf…
meilz381 Dec 28, 2021
d3618e1
update generated code
meilz381 Dec 28, 2021
cf081bb
fix api_management_api_tag test failures
meilz381 Jan 2, 2022
25bbeff
Merge branch 'hashicorp:main' into f/api_management_api_tag
meilz381 Jan 2, 2022
434bf81
Merge branch 'f/api_management_api_tag' of github.com:meilz381/terraf…
meilz381 Jan 2, 2022
09d5fd5
correct api_management_api_tag importer id parser
meilz381 Jan 2, 2022
079e49d
Merge branch 'hashicorp:main' into f/api_management_api_tag
meilz381 Jan 3, 2022
8ac65f3
fix api_management_api_tag import test
meilz381 Jan 7, 2022
7de3eb0
Merge branch 'hashicorp:main' into f/api_management_api_tag
meilz381 Jan 7, 2022
9957424
Merge branch 'hashicorp:main' into f/api_management_api_tag
meilz381 Jan 7, 2022
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
145 changes: 145 additions & 0 deletions internal/services/apimanagement/api_management_api_tag_resource.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
package apimanagement

import (
"fmt"
"log"
"time"

"github.com/hashicorp/terraform-provider-azurerm/helpers/tf"
"github.com/hashicorp/terraform-provider-azurerm/internal/clients"
"github.com/hashicorp/terraform-provider-azurerm/internal/services/apimanagement/parse"
"github.com/hashicorp/terraform-provider-azurerm/internal/services/apimanagement/validate"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/timeouts"
"github.com/hashicorp/terraform-provider-azurerm/utils"
)

func resourceApiManagementApiTag() *pluginsdk.Resource {
return &pluginsdk.Resource{
Create: resourceApiManagementApiTagCreate,
Read: resourceApiManagementApiTagRead,
Delete: resourceApiManagementApiTagDelete,

Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error {
_, err := parse.ApiTagID(id)
return err
}),

Timeouts: &pluginsdk.ResourceTimeout{
Create: pluginsdk.DefaultTimeout(30 * time.Minute),
Read: pluginsdk.DefaultTimeout(5 * time.Minute),
Delete: pluginsdk.DefaultTimeout(30 * time.Minute),
},

Schema: map[string]*pluginsdk.Schema{
"api_id": {
Type: pluginsdk.TypeString,
Required: true,
ForceNew: true,
ValidateFunc: validate.ApiID,
},

"name": {
Type: pluginsdk.TypeString,
Required: true,
ForceNew: true,
},
},
}
}

func resourceApiManagementApiTagCreate(d *pluginsdk.ResourceData, meta interface{}) error {
subscriptionId := meta.(*clients.Client).Account.SubscriptionId
client := meta.(*clients.Client).ApiManagement.TagClient
ctx, cancel := timeouts.ForCreate(meta.(*clients.Client).StopContext, d)
defer cancel()

apiId, err := parse.ApiID(d.Get("api_id").(string))
if err != nil {
return err
}

tagName := d.Get("name").(string)
tagId := parse.NewTagID(subscriptionId, apiId.ResourceGroup, apiId.ServiceName, tagName)
if err != nil {
return err
}

id := parse.NewApiTagID(subscriptionId, apiId.ResourceGroup, apiId.ServiceName, apiId.Name, tagId.Name)

tagExists, err := client.Get(ctx, apiId.ResourceGroup, apiId.ServiceName, tagId.ID())
if err != nil {
if !utils.ResponseWasNotFound(tagExists.Response) {
return fmt.Errorf("checking for presence of Tag %q: %s", id, err)
}
}

tagAssignmentExist, err := client.GetByAPI(ctx, apiId.ResourceGroup, apiId.ServiceName, apiId.Name, tagId.Name)
if err != nil {
if !utils.ResponseWasNotFound(tagAssignmentExist.Response) {
return fmt.Errorf("checking for presence of Tag Assignment %q: %s", id, err)
}
}

if !utils.ResponseWasNotFound(tagAssignmentExist.Response) {
return tf.ImportAsExistsError("azurerm_api_management_api_tag", id.ID())
}

if _, err := client.AssignToAPI(ctx, apiId.ResourceGroup, apiId.ServiceName, apiId.Name, tagId.Name); err != nil {
return fmt.Errorf("assigning to Api %q: %+v", id, err)
}

d.SetId(id.ID())

return resourceApiManagementApiTagRead(d, meta)
}

func resourceApiManagementApiTagRead(d *pluginsdk.ResourceData, meta interface{}) error {
subscriptionId := meta.(*clients.Client).Account.SubscriptionId
client := meta.(*clients.Client).ApiManagement.TagClient
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
defer cancel()

id, err := parse.ApiTagID(d.Id())
if err != nil {
return err
}

apiId := parse.NewApiID(subscriptionId, id.ResourceGroup, id.ServiceName, id.ApiName)
tagId := parse.NewTagID(subscriptionId, id.ResourceGroup, id.ServiceName, id.TagName)

resp, err := client.GetByAPI(ctx, id.ResourceGroup, id.ServiceName, apiId.Name, tagId.Name)
if err != nil {
if utils.ResponseWasNotFound(resp.Response) {
log.Printf("[DEBUG] %q was not found - removing from state!", id)
d.SetId("")
return nil
}

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

d.Set("api_id", apiId.ID())
d.Set("name", tagId.Name)

return nil
}

func resourceApiManagementApiTagDelete(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).ApiManagement.TagClient
ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d)
defer cancel()

id, err := parse.ApiTagID(d.Id())
if err != nil {
return err
}
apiId := parse.NewApiID(id.SubscriptionId, id.ResourceGroup, id.ServiceName, id.ApiName)
tagId := parse.NewTagID(id.SubscriptionId, id.ResourceGroup, id.ServiceName, id.TagName)

if _, err = client.DetachFromAPI(ctx, id.ResourceGroup, id.ServiceName, apiId.Name, tagId.Name); err != nil {
return fmt.Errorf("detaching api tag %q: %+v", id, err)
}

return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package apimanagement_test

import (
"context"
"fmt"
"testing"

"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/services/apimanagement/parse"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
"github.com/hashicorp/terraform-provider-azurerm/utils"
)

type ApiManagementApiTagResource struct {
}

func TestAccApiManagementApiTag_basic(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_api_management_api_tag", "test")
r := ApiManagementApiTagResource{}

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

func TestAccApiManagementApiTag_requiresImport(t *testing.T) {
data := acceptance.BuildTestData(t, "azurerm_api_management_api_tag", "test")
r := ApiManagementApiTagResource{}

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

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

resp, err := clients.ApiManagement.TagClient.GetByAPI(ctx, id.ResourceGroup, id.ServiceName, id.ApiName, id.TagName)
if err != nil {
return nil, fmt.Errorf("reading %q: %+v", id, err)
}

return utils.Bool(resp.ID != nil), nil
}

func (r ApiManagementApiTagResource) basic(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
resource "azurerm_api_management_tag" "test" {
api_management_id = azurerm_api_management.test.id
name = "acctest-Tag-%d"
}

resource "azurerm_api_management_api_tag" "test" {
api_id = azurerm_api_management_api.test.id
name = "acctest-Tag-%d"
}
`, ApiManagementApiResource{}.basic(data), data.RandomInteger, data.RandomInteger)
}

func (r ApiManagementApiTagResource) requiresImport(data acceptance.TestData) string {
return fmt.Sprintf(`
%s
resource "azurerm_api_management_api_tag" "import" {
api_id = azurerm_api_management_api.test.id
name = azurerm_api_management_api_tag.test.name
}
`, r.basic(data))
}
81 changes: 81 additions & 0 deletions internal/services/apimanagement/parse/api_tag.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package parse

// NOTE: this file is generated via 'go:generate' - manual changes will be overwritten

import (
"fmt"
"strings"

"github.com/hashicorp/go-azure-helpers/resourcemanager/resourceids"
)

type ApiTagId struct {
SubscriptionId string
ResourceGroup string
ServiceName string
ApiName string
TagName string
}

func NewApiTagID(subscriptionId, resourceGroup, serviceName, apiName, tagName string) ApiTagId {
return ApiTagId{
SubscriptionId: subscriptionId,
ResourceGroup: resourceGroup,
ServiceName: serviceName,
ApiName: apiName,
TagName: tagName,
}
}

func (id ApiTagId) String() string {
segments := []string{
fmt.Sprintf("Tag Name %q", id.TagName),
fmt.Sprintf("Api Name %q", id.ApiName),
fmt.Sprintf("Service Name %q", id.ServiceName),
fmt.Sprintf("Resource Group %q", id.ResourceGroup),
}
segmentsStr := strings.Join(segments, " / ")
return fmt.Sprintf("%s: (%s)", "Api Tag", segmentsStr)
}

func (id ApiTagId) ID() string {
fmtString := "/subscriptions/%s/resourceGroups/%s/providers/Microsoft.ApiManagement/service/%s/apis/%s/tags/%s"
return fmt.Sprintf(fmtString, id.SubscriptionId, id.ResourceGroup, id.ServiceName, id.ApiName, id.TagName)
}

// ApiTagID parses a ApiTag ID into an ApiTagId struct
func ApiTagID(input string) (*ApiTagId, error) {
id, err := resourceids.ParseAzureResourceID(input)
if err != nil {
return nil, err
}

resourceId := ApiTagId{
SubscriptionId: id.SubscriptionID,
ResourceGroup: id.ResourceGroup,
}

if resourceId.SubscriptionId == "" {
return nil, fmt.Errorf("ID was missing the 'subscriptions' element")
}

if resourceId.ResourceGroup == "" {
return nil, fmt.Errorf("ID was missing the 'resourceGroups' element")
}

if resourceId.ServiceName, err = id.PopSegment("service"); err != nil {
return nil, err
}
if resourceId.ApiName, err = id.PopSegment("apis"); err != nil {
return nil, err
}
if resourceId.TagName, err = id.PopSegment("tags"); err != nil {
return nil, err
}

if err := id.ValidateNoEmptySegments(input); err != nil {
return nil, err
}

return &resourceId, nil
}
Loading