Skip to content

Commit

Permalink
New Resource azurerm_maintenance_configuration (#6038)
Browse files Browse the repository at this point in the history
partially address #6037
Once it is merged, I'll go on implementing azurerm_maintenance_assignment

After tested, I found the resource_group_name from the response of read api is always small case, so I use azure.SchemaResourceGroupNameDiffSuppress()

Another point is the key of tags from the response of read api is always small case
  • Loading branch information
njuCZ committed Apr 21, 2020
1 parent cfe6695 commit 95efca9
Show file tree
Hide file tree
Showing 26 changed files with 3,217 additions and 0 deletions.
3 changes: 3 additions & 0 deletions azurerm/internal/clients/client.go
Expand Up @@ -41,6 +41,7 @@ import (
loganalytics "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/loganalytics/client"
logic "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/logic/client"
machinelearning "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/machinelearning/client"
maintenance "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/maintenance/client"
managedapplication "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/managedapplications/client"
managementgroup "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/managementgroup/client"
maps "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/maps/client"
Expand Down Expand Up @@ -118,6 +119,7 @@ type Client struct {
LogAnalytics *loganalytics.Client
Logic *logic.Client
MachineLearning *machinelearning.Client
Maintenance *maintenance.Client
ManagedApplication *managedapplication.Client
ManagementGroups *managementgroup.Client
Maps *maps.Client
Expand Down Expand Up @@ -196,6 +198,7 @@ func (client *Client) Build(ctx context.Context, o *common.ClientOptions) error
client.LogAnalytics = loganalytics.NewClient(o)
client.Logic = logic.NewClient(o)
client.MachineLearning = machinelearning.NewClient(o)
client.Maintenance = maintenance.NewClient(o)
client.ManagedApplication = managedapplication.NewClient(o)
client.ManagementGroups = managementgroup.NewClient(o)
client.Maps = maps.NewClient(o)
Expand Down
1 change: 1 addition & 0 deletions azurerm/internal/provider/required_resource_providers.go
Expand Up @@ -50,6 +50,7 @@ func RequiredResourceProviders() map[string]struct{} {
"microsoft.insights": {},
"Microsoft.Logic": {},
"Microsoft.MachineLearningServices": {},
"Microsoft.Maintenance": {},
"Microsoft.ManagedIdentity": {},
"Microsoft.Management": {},
"Microsoft.Maps": {},
Expand Down
2 changes: 2 additions & 0 deletions azurerm/internal/provider/services.go
Expand Up @@ -37,6 +37,7 @@ import (
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/loganalytics"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/logic"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/machinelearning"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/maintenance"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/managedapplications"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/managementgroup"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/maps"
Expand Down Expand Up @@ -111,6 +112,7 @@ func SupportedServices() []common.ServiceRegistration {
loganalytics.Registration{},
logic.Registration{},
machinelearning.Registration{},
maintenance.Registration{},
managedapplications.Registration{},
managementgroup.Registration{},
maps.Registration{},
Expand Down
19 changes: 19 additions & 0 deletions azurerm/internal/services/maintenance/client/client.go
@@ -0,0 +1,19 @@
package client

import (
"github.com/Azure/azure-sdk-for-go/services/preview/maintenance/mgmt/2018-06-01-preview/maintenance"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/common"
)

type Client struct {
ConfigurationsClient *maintenance.ConfigurationsClient
}

func NewClient(o *common.ClientOptions) *Client {
configurationsClient := maintenance.NewConfigurationsClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
o.ConfigureClient(&configurationsClient.Client, o.ResourceManagerAuthorizer)

return &Client{
ConfigurationsClient: &configurationsClient,
}
}
@@ -0,0 +1,77 @@
package maintenance

import (
"fmt"
"log"
"time"

"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/location"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tags"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
)

func dataSourceMaintenanceConfiguration() *schema.Resource {
return &schema.Resource{
Read: dataSourceArmMaintenanceConfigurationRead,

Timeouts: &schema.ResourceTimeout{
Read: schema.DefaultTimeout(5 * time.Minute),
},

Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringIsNotEmpty,
},

"resource_group_name": azure.SchemaResourceGroupNameForDataSource(),

"location": azure.SchemaLocationForDataSource(),

"scope": {
Type: schema.TypeString,
Computed: true,
},

"tags": tags.SchemaDataSource(),
},
}
}

func dataSourceArmMaintenanceConfigurationRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Maintenance.ConfigurationsClient
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
defer cancel()

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

resp, err := client.Get(ctx, resGroup, name)
if err != nil {
if utils.ResponseWasNotFound(resp.Response) {
log.Printf("[INFO] Maintenance Configuration %q does not exist - removing from state", d.Id())
d.SetId("")
return nil
}
return fmt.Errorf("failure retrieving MaintenanceConfiguration %q (Resource Group %q): %+v", name, resGroup, err)
}

if id := resp.ID; id != nil {
d.SetId(*resp.ID)
}

d.Set("name", name)
d.Set("resource_group_name", resGroup)
d.Set("location", location.NormalizeNilable(resp.Location))
if props := resp.ConfigurationProperties; props != nil {
d.Set("scope", props.MaintenanceScope)
}

return tags.FlattenAndSet(d, resp.Tags)
}
@@ -0,0 +1,39 @@
package parse

import (
"fmt"

"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
)

type MaintenanceConfigurationId struct {
ResourceGroup string
Name string
}

func MaintenanceConfigurationID(input string) (*MaintenanceConfigurationId, error) {
id, err := azure.ParseAzureResourceID(input)
if err != nil {
return nil, fmt.Errorf("[ERROR] Unable to parse MaintenanceConfiguration ID %q: %+v", input, err)
}

maintenanceConfiguration := MaintenanceConfigurationId{
ResourceGroup: id.ResourceGroup,
}

if name, err := id.PopSegment("maintenanceconfigurations"); err != nil {
if name, err = id.PopSegment("maintenanceConfigurations"); err != nil {
return nil, fmt.Errorf("[ERROR] Unable to parse maintenanceconfigurations/maintenanceConfigurations element %q: %+v", input, err)
} else {
maintenanceConfiguration.Name = name
}
} else {
maintenanceConfiguration.Name = name
}

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

return &maintenanceConfiguration, nil
}
@@ -0,0 +1,74 @@
package parse

import (
"testing"
)

func TestMaintenanceConfigurationID(t *testing.T) {
testData := []struct {
Name string
Input string
Error bool
Expect *MaintenanceConfigurationId
}{
{
Name: "Empty",
Input: "",
Error: true,
},
{
Name: "No Resource Groups Segment",
Input: "/subscriptions/00000000-0000-0000-0000-000000000000",
Error: true,
},
{
Name: "No Resource Groups Value",
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/",
Error: true,
},
{
Name: "Resource Group ID",
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/",
Error: true,
},
{
Name: "Missing Maintenance Configuration Value",
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/microsoft.maintenance/maintenanceconfigurations/",
Error: true,
},
{
Name: "Maintenance Configuration ID",
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/microsoft.maintenance/maintenanceconfigurations/mc1",
Error: false,
Expect: &MaintenanceConfigurationId{
ResourceGroup: "resGroup1",
Name: "mc1",
},
},
{
Name: "Wrong Casing",
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/microsoft.maintenance/MaintenanceConfigurations/mc1",
Error: true,
},
}

for _, v := range testData {
t.Logf("[DEBUG] Testing %q..", v.Name)

actual, err := MaintenanceConfigurationID(v.Input)
if err != nil {
if v.Expect == nil {
continue
}
t.Fatalf("Expected a value but got an error: %s", err)
}

if actual.ResourceGroup != v.Expect.ResourceGroup {
t.Fatalf("Expected %q but got %q for ResourceGroup", v.Expect.ResourceGroup, actual.ResourceGroup)
}

if actual.Name != v.Expect.Name {
t.Fatalf("Expected %q but got %q for Name", v.Expect.Name, actual.Name)
}
}
}
29 changes: 29 additions & 0 deletions azurerm/internal/services/maintenance/registration.go
@@ -0,0 +1,29 @@
package maintenance

import (
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
)

type Registration struct{}

func (r Registration) Name() string {
return "Maintenance"
}

func (r Registration) WebsiteCategories() []string {
return []string{
"Maintenance",
}
}

func (r Registration) SupportedDataSources() map[string]*schema.Resource {
return map[string]*schema.Resource{
"azurerm_maintenance_configuration": dataSourceMaintenanceConfiguration(),
}
}

func (r Registration) SupportedResources() map[string]*schema.Resource {
return map[string]*schema.Resource{
"azurerm_maintenance_configuration": resourceArmMaintenanceConfiguration(),
}
}

0 comments on commit 95efca9

Please sign in to comment.