Skip to content

Commit 98c5ba6

Browse files
authored
azurerm_analysis_services_server - fix multiple issues (#31870)
1 parent 81aa86f commit 98c5ba6

File tree

3 files changed

+70
-35
lines changed

3 files changed

+70
-35
lines changed

internal/services/analysisservices/analysis_services_server_resource.go

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,9 @@ func resourceAnalysisServicesServer() *pluginsdk.Resource {
9292
},
9393

9494
"ipv4_firewall_rule": {
95-
Type: pluginsdk.TypeSet,
96-
Optional: true,
95+
Type: pluginsdk.TypeSet,
96+
Optional: true,
97+
RequiredWith: []string{"power_bi_service_enabled"},
9798
Elem: &pluginsdk.Resource{
9899
Schema: map[string]*pluginsdk.Schema{
99100
"name": {
@@ -177,15 +178,6 @@ func resourceAnalysisServicesServerCreate(d *pluginsdk.ResourceData, meta interf
177178
Tags: tags.Expand(d.Get("tags").(map[string]interface{})),
178179
}
179180

180-
if v, ok := d.GetOk("power_bi_service_enabled"); ok {
181-
if analysisServicesServer.Properties.IPV4FirewallSettings == nil {
182-
analysisServicesServer.Properties.IPV4FirewallSettings = &servers.IPv4FirewallSettings{
183-
FirewallRules: pointer.To(make([]servers.IPv4FirewallRule, 0)),
184-
}
185-
}
186-
analysisServicesServer.Properties.IPV4FirewallSettings.EnablePowerBIService = pointer.To(v.(bool))
187-
}
188-
189181
if querypoolConnectionMode, ok := d.GetOk("querypool_connection_mode"); ok {
190182
analysisServicesServer.Properties.QuerypoolConnectionMode = pointer.To(servers.ConnectionMode(querypoolConnectionMode.(string)))
191183
}
@@ -315,15 +307,6 @@ func resourceAnalysisServicesServerUpdate(d *pluginsdk.ResourceData, meta interf
315307
},
316308
}
317309

318-
if d.HasChange("power_bi_service_enabled") {
319-
if analysisServicesServer.Properties.IPV4FirewallSettings == nil {
320-
analysisServicesServer.Properties.IPV4FirewallSettings = &servers.IPv4FirewallSettings{
321-
FirewallRules: pointer.To(make([]servers.IPv4FirewallRule, 0)),
322-
}
323-
}
324-
analysisServicesServer.Properties.IPV4FirewallSettings.EnablePowerBIService = pointer.To(d.Get("power_bi_service_enabled").(bool))
325-
}
326-
327310
if containerUri, ok := d.GetOk("backup_blob_container_uri"); ok {
328311
analysisServicesServer.Properties.BackupBlobContainerUri = pointer.To(containerUri.(string))
329312
}
@@ -374,25 +357,32 @@ func expandAnalysisServicesServerAdminUsers(d *pluginsdk.ResourceData) *servers.
374357
}
375358

376359
func expandAnalysisServicesServerFirewallSettings(d *pluginsdk.ResourceData) *servers.IPv4FirewallSettings {
377-
firewallRules := d.Get("ipv4_firewall_rule").(*pluginsdk.Set).List()
360+
fwRules := make([]servers.IPv4FirewallRule, 0)
361+
result := servers.IPv4FirewallSettings{}
378362

363+
if !pluginsdk.IsExplicitlyNullInConfig(d, "power_bi_service_enabled") {
364+
result.EnablePowerBIService = pointer.To(d.Get("power_bi_service_enabled").(bool))
365+
// when `power_bi_service_enabled` is specified, we must send at least an empty array for `FirewallRules`
366+
// otherwise the API errors out with a 400.
367+
result.FirewallRules = &fwRules
368+
}
369+
370+
firewallRules := d.Get("ipv4_firewall_rule").(*pluginsdk.Set).List()
379371
if len(firewallRules) == 0 {
380-
return nil
372+
return &result
381373
}
382374

383-
firewallSettings := servers.IPv4FirewallSettings{}
384-
fwRules := make([]servers.IPv4FirewallRule, len(firewallRules))
385-
for i, v := range firewallRules {
375+
for _, v := range firewallRules {
386376
fwRule := v.(map[string]interface{})
387-
fwRules[i] = servers.IPv4FirewallRule{
377+
fwRules = append(fwRules, servers.IPv4FirewallRule{
388378
FirewallRuleName: pointer.To(fwRule["name"].(string)),
389379
RangeStart: pointer.To(fwRule["range_start"].(string)),
390380
RangeEnd: pointer.To(fwRule["range_end"].(string)),
391-
}
381+
})
392382
}
393-
firewallSettings.FirewallRules = &fwRules
383+
result.FirewallRules = &fwRules
394384

395-
return &firewallSettings
385+
return &result
396386
}
397387

398388
func flattenAnalysisServicesServerFirewallSettings(serverProperties *servers.AnalysisServicesServerProperties) (*bool, *pluginsdk.Set) {

internal/services/analysisservices/analysis_services_server_resource_test.go

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,29 +93,52 @@ func TestAccAnalysisServicesServer_firewallSettings(t *testing.T) {
9393

9494
data.ResourceTest(t, r, []acceptance.TestStep{
9595
{
96-
Config: r.firewallSettings1(data, true),
96+
Config: r.firewallSettingsSingleRule(data, false),
97+
Check: acceptance.ComposeTestCheckFunc(
98+
check.That(data.ResourceName).ExistsInAzure(r),
99+
check.That(data.ResourceName).Key("ipv4_firewall_rule.#").HasValue("1"),
100+
),
101+
},
102+
data.ImportStep(),
103+
{
104+
Config: r.firewallSettingsNoRules(data, true),
97105
Check: acceptance.ComposeTestCheckFunc(
98106
check.That(data.ResourceName).ExistsInAzure(r),
99107
check.That(data.ResourceName).Key("ipv4_firewall_rule.#").HasValue("0"),
100108
),
101109
},
102110
data.ImportStep(),
103111
{
104-
Config: r.firewallSettings2(data, false),
112+
Config: r.firewallSettingsSingleRule(data, true),
105113
Check: acceptance.ComposeTestCheckFunc(
106114
check.That(data.ResourceName).ExistsInAzure(r),
107115
check.That(data.ResourceName).Key("ipv4_firewall_rule.#").HasValue("1"),
108116
),
109117
},
110118
data.ImportStep(),
111119
{
112-
Config: r.firewallSettings3(data, true),
120+
Config: r.firewallSettingsMultipleRules(data, true),
121+
Check: acceptance.ComposeTestCheckFunc(
122+
check.That(data.ResourceName).ExistsInAzure(r),
123+
check.That(data.ResourceName).Key("ipv4_firewall_rule.#").HasValue("2"),
124+
),
125+
},
126+
data.ImportStep(),
127+
{
128+
Config: r.firewallSettingsMultipleRules(data, false),
113129
Check: acceptance.ComposeTestCheckFunc(
114130
check.That(data.ResourceName).ExistsInAzure(r),
115131
check.That(data.ResourceName).Key("ipv4_firewall_rule.#").HasValue("2"),
116132
),
117133
},
118134
data.ImportStep(),
135+
{
136+
Config: r.firewallSettingsRemoved(data),
137+
Check: acceptance.ComposeTestCheckFunc(
138+
check.That(data.ResourceName).ExistsInAzure(r),
139+
),
140+
},
141+
data.ImportStep(),
119142
})
120143
}
121144

@@ -300,7 +323,7 @@ resource "azurerm_analysis_services_server" "test" {
300323
`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, connectionMode)
301324
}
302325

303-
func (t AnalysisServicesServerResource) firewallSettings1(data acceptance.TestData, enablePowerBIService bool) string {
326+
func (t AnalysisServicesServerResource) firewallSettingsNoRules(data acceptance.TestData, enablePowerBIService bool) string {
304327
return fmt.Sprintf(`
305328
provider "azurerm" {
306329
features {}
@@ -321,7 +344,7 @@ resource "azurerm_analysis_services_server" "test" {
321344
`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, enablePowerBIService)
322345
}
323346

324-
func (t AnalysisServicesServerResource) firewallSettings2(data acceptance.TestData, enablePowerBIService bool) string {
347+
func (t AnalysisServicesServerResource) firewallSettingsSingleRule(data acceptance.TestData, enablePowerBIService bool) string {
325348
return fmt.Sprintf(`
326349
provider "azurerm" {
327350
features {}
@@ -348,7 +371,7 @@ resource "azurerm_analysis_services_server" "test" {
348371
`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, enablePowerBIService)
349372
}
350373

351-
func (t AnalysisServicesServerResource) firewallSettings3(data acceptance.TestData, enablePowerBIService bool) string {
374+
func (t AnalysisServicesServerResource) firewallSettingsMultipleRules(data acceptance.TestData, enablePowerBIService bool) string {
352375
return fmt.Sprintf(`
353376
provider "azurerm" {
354377
features {}
@@ -381,6 +404,26 @@ resource "azurerm_analysis_services_server" "test" {
381404
`, data.RandomInteger, data.Locations.Primary, data.RandomInteger, enablePowerBIService)
382405
}
383406

407+
func (t AnalysisServicesServerResource) firewallSettingsRemoved(data acceptance.TestData) string {
408+
return fmt.Sprintf(`
409+
provider "azurerm" {
410+
features {}
411+
}
412+
413+
resource "azurerm_resource_group" "test" {
414+
name = "acctestRG-analysis-%[1]d"
415+
location = "%[2]s"
416+
}
417+
418+
resource "azurerm_analysis_services_server" "test" {
419+
name = "acctestass%[1]d"
420+
location = azurerm_resource_group.test.location
421+
resource_group_name = azurerm_resource_group.test.name
422+
sku = "B1"
423+
}
424+
`, data.RandomInteger, data.Locations.Primary)
425+
}
426+
384427
func (t AnalysisServicesServerResource) adminUsers(data acceptance.TestData, adminUsers []string) string {
385428
return fmt.Sprintf(`
386429
provider "azurerm" {

website/docs/r/analysis_services_server.html.markdown

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ The following arguments are supported:
6060

6161
* `power_bi_service_enabled` - (Optional) Indicates if the Power BI service is allowed to access or not.
6262

63+
~> **Note:** `power_bi_service_enabled` is required when `ipv4_firewall_rule` is defined.
64+
6365
* `ipv4_firewall_rule` - (Optional) One or more `ipv4_firewall_rule` block(s) as defined below.
6466

6567
* `tags` - (Optional) A mapping of tags to assign to the resource.

0 commit comments

Comments
 (0)