Skip to content

Commit

Permalink
azuread_application: new property prevent_duplicate_names
Browse files Browse the repository at this point in the history
  • Loading branch information
manicminer committed Jun 23, 2020
1 parent 2db0fb8 commit df2dc47
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 0 deletions.
28 changes: 28 additions & 0 deletions azuread/helpers/graph/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -262,3 +262,31 @@ func ApplicationAddOwners(client graphrbac.ApplicationsClient, ctx context.Conte

return nil
}

func ApplicationFindByName(client graphrbac.ApplicationsClient, ctx context.Context, name string) (*graphrbac.Application, error) {
nameFilter := fmt.Sprintf("displayName eq '%s'", name)
resp, err := client.List(ctx, nameFilter)

if err != nil {
return nil, fmt.Errorf("unable to list Applications with filter %q: %+v", nameFilter, err)
}

for _, app := range resp.Values() {
if *app.DisplayName == name {
return &app, nil
}
}

return nil, nil
}

func ApplicationCheckNameAvailability(client graphrbac.ApplicationsClient, ctx context.Context, name string) error {
existingApp, err := ApplicationFindByName(client, ctx, name)
if err != nil {
return err
}
if existingApp != nil {
return fmt.Errorf("existing Application with name %q (AppID: %q) was found and `prevent_duplicate_names` was specified", name, *existingApp.AppID)
}
return nil
}
25 changes: 25 additions & 0 deletions azuread/resource_application.go
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,11 @@ func resourceApplication() *schema.Resource {
},
},
},
"prevent_duplicate_names": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
},
}
}
Expand All @@ -294,6 +299,14 @@ func resourceApplicationCreate(d *schema.ResourceData, meta interface{}) error {
ctx := meta.(*ArmClient).StopContext

name := d.Get("name").(string)

if d.Get("prevent_duplicate_names").(bool) {
err := graph.ApplicationCheckNameAvailability(client, ctx, name)
if err != nil {
return err
}
}

appType := d.Get("type")
identUrls, hasIdentUrls := d.GetOk("identifier_uris")
if appType == "native" {
Expand Down Expand Up @@ -400,6 +413,13 @@ func resourceApplicationUpdate(d *schema.ResourceData, meta interface{}) error {

name := d.Get("name").(string)

if d.Get("prevent_duplicate_names").(bool) {
err := graph.ApplicationCheckNameAvailability(client, ctx, name)
if err != nil {
return err
}
}

var properties graphrbac.ApplicationUpdateParameters

if d.HasChange("name") {
Expand Down Expand Up @@ -591,6 +611,10 @@ func resourceApplicationRead(d *schema.ResourceData, meta interface{}) error {
return fmt.Errorf("setting `owners`: %+v", err)
}

if preventDuplicates := d.Get("prevent_duplicate_names").(bool); !preventDuplicates {
d.Set("prevent_duplicate_names", false)
}

return nil
}

Expand Down Expand Up @@ -904,3 +928,4 @@ func adApplicationSetOwnersTo(client graphrbac.ApplicationsClient, ctx context.C

return nil
}

27 changes: 27 additions & 0 deletions azuread/resource_application_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -584,6 +584,22 @@ func TestAccAzureADApplication_oauth2PermissionsUpdate(t *testing.T) {
})
}

func TestAccAzureADApplication_preventDuplicateNames(t *testing.T) {
ri := tf.AccRandTimeInt()

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
CheckDestroy: testCheckADApplicationDestroy,
Steps: []resource.TestStep{
{
Config: testAccADApplication_duplicateName(ri),
ExpectError: regexp.MustCompile("existing Application .+ was found"),
},
},
})
}

func testCheckADApplicationExists(name string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[name]
Expand Down Expand Up @@ -913,3 +929,14 @@ resource "azuread_application" "test" {
}
`, ri)
}

func testAccADApplication_duplicateName(ri int) string {
return fmt.Sprintf(`
%s
resource "azuread_application" "duplicate" {
name = azuread_application.test.name
prevent_duplicate_names = true
}
`, testAccADApplication_basic(ri))
}
2 changes: 2 additions & 0 deletions website/docs/r/application.html.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ The following arguments are supported:

* `oauth2_permissions` - (Optional) A collection of OAuth 2.0 permission scopes that the web API (resource) app exposes to client apps. Each permission is covered by `oauth2_permissions` blocks as documented below.

* `prevent_duplicate_names` - (Optional) If `true`, will return an error when an existing Application is found with the same name. Defaults to `false`.

---

`required_resource_access` supports the following:
Expand Down

0 comments on commit df2dc47

Please sign in to comment.