Skip to content

Commit

Permalink
Split remaining CreateUpdate functions for maintenance and `managed…
Browse files Browse the repository at this point in the history
…applications` (#25371)

* split create/update for logz

* split create/update for maintenance

* split create update for managed applications

* use CreateOrUpdate method for update

* refactor logz resources

* review comments

* revert to CreateOrUpdate over Update method

* revert split since logz tests do not work
  • Loading branch information
stephybun authored Mar 22, 2024
1 parent 412483b commit ac13fcc
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 36 deletions.
93 changes: 75 additions & 18 deletions internal/services/maintenance/maintenance_configuration_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ import (
"github.com/hashicorp/terraform-provider-azurerm/utils"
)

func resourceArmMaintenanceConfiguration() *pluginsdk.Resource {
func resourceMaintenanceConfiguration() *pluginsdk.Resource {
return &pluginsdk.Resource{
Create: resourceArmMaintenanceConfigurationCreateUpdate,
Read: resourceArmMaintenanceConfigurationRead,
Update: resourceArmMaintenanceConfigurationCreateUpdate,
Delete: resourceArmMaintenanceConfigurationDelete,
Create: resourceMaintenanceConfigurationCreate,
Read: resourceMaintenanceConfigurationRead,
Update: resourceMaintenanceConfigurationUpdate,
Delete: resourceMaintenanceConfigurationDelete,

SchemaVersion: 1,
StateUpgraders: pluginsdk.StateUpgrades(map[int]pluginsdk.StateUpgrade{
Expand Down Expand Up @@ -237,24 +237,23 @@ func resourceArmMaintenanceConfiguration() *pluginsdk.Resource {
}
}

func resourceArmMaintenanceConfigurationCreateUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
func resourceMaintenanceConfigurationCreate(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Maintenance.ConfigurationsClient
subscriptionId := meta.(*clients.Client).Account.SubscriptionId
ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d)
defer cancel()

id := maintenanceconfigurations.NewMaintenanceConfigurationID(subscriptionId, d.Get("resource_group_name").(string), d.Get("name").(string))
if d.IsNewResource() {
existing, err := client.Get(ctx, id)
if err != nil {
if !response.WasNotFound(existing.HttpResponse) {
return fmt.Errorf("checking for presence of existing %s: %+v", id, err)
}
}

existing, err := client.Get(ctx, id)
if err != nil {
if !response.WasNotFound(existing.HttpResponse) {
return tf.ImportAsExistsError("azurerm_maintenance_configuration", id.ID())
return fmt.Errorf("checking for presence of existing %s: %+v", id, err)
}
}
if !response.WasNotFound(existing.HttpResponse) {
return tf.ImportAsExistsError("azurerm_maintenance_configuration", id.ID())
}

scope := maintenanceconfigurations.MaintenanceScope(d.Get("scope").(string))
visibility := maintenanceconfigurations.Visibility(d.Get("visibility").(string))
Expand Down Expand Up @@ -293,14 +292,72 @@ func resourceArmMaintenanceConfigurationCreateUpdate(d *pluginsdk.ResourceData,
}

if _, err := client.CreateOrUpdate(ctx, id, configuration); err != nil {
return fmt.Errorf("creating/updating %s: %+v", id, err)
return fmt.Errorf("creating %s: %+v", id, err)
}

d.SetId(id.ID())
return resourceArmMaintenanceConfigurationRead(d, meta)
return resourceMaintenanceConfigurationRead(d, meta)
}

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

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

existing, err := client.Get(ctx, *id)
if err != nil {
return fmt.Errorf("retrieving %s: %+v", id, err)
}

payload := existing.Model

if d.HasChanges("scope", "window", "install_patches", "properties") {
scope := maintenanceconfigurations.MaintenanceScope(d.Get("scope").(string))
window := expandMaintenanceConfigurationWindow(d.Get("window").([]interface{}))
installPatches := expandMaintenanceConfigurationInstallPatches(d.Get("install_patches").([]interface{}))
extensionProperties := expandExtensionProperties(d.Get("properties").(map[string]interface{}))
if scope == maintenanceconfigurations.MaintenanceScopeInGuestPatch {
if window == nil {
return fmt.Errorf("`window` must be specified when `scope` is `InGuestPatch`")
}
if installPatches == nil {
return fmt.Errorf("`install_patches` must be specified when `scope` is `InGuestPatch`")
}
if _, ok := (*extensionProperties)["InGuestPatchMode"]; !ok {
if _, ok := d.GetOk("in_guest_user_patch_mode"); !ok {
return fmt.Errorf("`in_guest_user_patch_mode` must be specified when `scope` is `InGuestPatch`")
}
(*extensionProperties)["InGuestPatchMode"] = d.Get("in_guest_user_patch_mode").(string)
}
}

payload.Properties.MaintenanceScope = &scope
payload.Properties.MaintenanceWindow = window
payload.Properties.ExtensionProperties = extensionProperties
payload.Properties.InstallPatches = installPatches
}

if d.HasChange("visibility") {
payload.Properties.Visibility = pointer.To(maintenanceconfigurations.Visibility(d.Get("visibility").(string)))
}

if d.HasChange("tags") {
payload.Tags = tags.Expand(d.Get("tags").(map[string]interface{}))
}

if _, err := client.CreateOrUpdate(ctx, *id, *payload); err != nil {
return fmt.Errorf("updating %s: %+v", id, err)
}

return resourceMaintenanceConfigurationRead(d, meta)
}

func resourceArmMaintenanceConfigurationRead(d *pluginsdk.ResourceData, meta interface{}) error {
func resourceMaintenanceConfigurationRead(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Maintenance.ConfigurationsClient
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
defer cancel()
Expand Down Expand Up @@ -353,7 +410,7 @@ func resourceArmMaintenanceConfigurationRead(d *pluginsdk.ResourceData, meta int
return nil
}

func resourceArmMaintenanceConfigurationDelete(d *pluginsdk.ResourceData, meta interface{}) error {
func resourceMaintenanceConfigurationDelete(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).Maintenance.ConfigurationsClient
ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d)
defer cancel()
Expand Down
2 changes: 1 addition & 1 deletion internal/services/maintenance/registration.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,6 @@ func (r Registration) SupportedResources() map[string]*pluginsdk.Resource {
"azurerm_maintenance_assignment_dedicated_host": resourceArmMaintenanceAssignmentDedicatedHost(),
"azurerm_maintenance_assignment_virtual_machine": resourceArmMaintenanceAssignmentVirtualMachine(),
"azurerm_maintenance_assignment_virtual_machine_scale_set": resourceArmMaintenanceAssignmentVirtualMachineScaleSet(),
"azurerm_maintenance_configuration": resourceArmMaintenanceConfiguration(),
"azurerm_maintenance_configuration": resourceMaintenanceConfiguration(),
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,13 @@ import (
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk"
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation"
"github.com/hashicorp/terraform-provider-azurerm/internal/timeouts"
"github.com/hashicorp/terraform-provider-azurerm/utils"
)

func resourceManagedApplicationDefinition() *pluginsdk.Resource {
return &pluginsdk.Resource{
Create: resourceManagedApplicationDefinitionCreateUpdate,
Create: resourceManagedApplicationDefinitionCreate,
Read: resourceManagedApplicationDefinitionRead,
Update: resourceManagedApplicationDefinitionCreateUpdate,
Update: resourceManagedApplicationDefinitionUpdate,
Delete: resourceManagedApplicationDefinitionDelete,

Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error {
Expand Down Expand Up @@ -132,33 +131,31 @@ func resourceManagedApplicationDefinition() *pluginsdk.Resource {
}
}

func resourceManagedApplicationDefinitionCreateUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
func resourceManagedApplicationDefinitionCreate(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).ManagedApplication.ApplicationDefinitionClient
subscriptionId := meta.(*clients.Client).Account.SubscriptionId
ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d)
defer cancel()

id := applicationdefinitions.NewApplicationDefinitionID(subscriptionId, d.Get("resource_group_name").(string), d.Get("name").(string))

if d.IsNewResource() {
existing, err := client.Get(ctx, id)
if err != nil {
if !response.WasNotFound(existing.HttpResponse) {
return fmt.Errorf("failed to check for presence of existing %s: %+v", id, err)
}
}
existing, err := client.Get(ctx, id)
if err != nil {
if !response.WasNotFound(existing.HttpResponse) {
return tf.ImportAsExistsError("azurerm_managed_application_definition", id.ID())
return fmt.Errorf("failed to check for presence of existing %s: %+v", id, err)
}
}
if !response.WasNotFound(existing.HttpResponse) {
return tf.ImportAsExistsError("azurerm_managed_application_definition", id.ID())
}

parameters := applicationdefinitions.ApplicationDefinition{
Location: pointer.To(location.Normalize(d.Get("location").(string))),
Properties: applicationdefinitions.ApplicationDefinitionProperties{
Authorizations: expandManagedApplicationDefinitionAuthorization(d.Get("authorization").(*pluginsdk.Set).List()),
Description: pointer.To(d.Get("description").(string)),
DisplayName: pointer.To(d.Get("display_name").(string)),
IsEnabled: utils.Bool(d.Get("package_enabled").(bool)),
IsEnabled: pointer.To(d.Get("package_enabled").(bool)),
LockLevel: applicationdefinitions.ApplicationLockLevel(d.Get("lock_level").(string)),
},
Tags: tags.Expand(d.Get("tags").(map[string]interface{})),
Expand All @@ -177,7 +174,66 @@ func resourceManagedApplicationDefinitionCreateUpdate(d *pluginsdk.ResourceData,
}

if _, err := client.CreateOrUpdate(ctx, id, parameters); err != nil {
return fmt.Errorf("failed to create %s: %+v", id, err)
return fmt.Errorf("creating %s: %+v", id, err)
}

d.SetId(id.ID())

return resourceManagedApplicationDefinitionRead(d, meta)
}

func resourceManagedApplicationDefinitionUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).ManagedApplication.ApplicationDefinitionClient
ctx, cancel := timeouts.ForUpdate(meta.(*clients.Client).StopContext, d)
defer cancel()

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

existing, err := client.Get(ctx, *id)
if err != nil {
return fmt.Errorf("retrieving %s: %+v", id, err)
}

payload := existing.Model

if d.HasChange("description") {
payload.Properties.Description = pointer.To(d.Get("description").(string))
}

if d.HasChange("display_name") {
payload.Properties.DisplayName = pointer.To(d.Get("display_name").(string))
}

if d.HasChange("package_enabled") {
payload.Properties.IsEnabled = pointer.To(d.Get("package_enabled").(bool))
}

if d.HasChange("authorization") {
payload.Properties.Authorizations = expandManagedApplicationDefinitionAuthorization(d.Get("authorization").(*pluginsdk.Set).List())
}

if d.HasChange("create_ui_definition") {
payload.Properties.CreateUiDefinition = pointer.To(d.Get("create_ui_definition"))
}

if d.HasChange("main_template") {
payload.Properties.MainTemplate = pointer.To(d.Get("main_template"))
}

if d.HasChange("package_file_uri") {
payload.Properties.PackageFileUri = pointer.To(d.Get("package_file_uri").(string))
}

if d.HasChange("tags") {
payload.Tags = tags.Expand(d.Get("tags").(map[string]interface{}))
}

// update payload only supports tags, so we'll continue using CreateOrUpdate method here
if _, err := client.CreateOrUpdate(ctx, *id, *payload); err != nil {
return fmt.Errorf("updating %s: %+v", id, err)
}

d.SetId(id.ID())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ import (

func resourceManagedApplication() *pluginsdk.Resource {
return &pluginsdk.Resource{
Create: resourceManagedApplicationCreateUpdate,
Create: resourceManagedApplicationCreate,
Read: resourceManagedApplicationRead,
Update: resourceManagedApplicationCreateUpdate,
Update: resourceManagedApplicationUpdate,
Delete: resourceManagedApplicationDelete,

Importer: pluginsdk.ImporterValidatingResourceId(func(id string) error {
Expand Down Expand Up @@ -164,7 +164,7 @@ func resourceManagedApplicationSchema() map[string]*pluginsdk.Schema {
return schema
}

func resourceManagedApplicationCreateUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
func resourceManagedApplicationCreate(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).ManagedApplication.ApplicationClient
subscriptionId := meta.(*clients.Client).Account.SubscriptionId
ctx, cancel := timeouts.ForCreateUpdate(meta.(*clients.Client).StopContext, d)
Expand Down Expand Up @@ -224,6 +224,48 @@ func resourceManagedApplicationCreateUpdate(d *pluginsdk.ResourceData, meta inte
return resourceManagedApplicationRead(d, meta)
}

func resourceManagedApplicationUpdate(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).ManagedApplication.ApplicationClient
ctx, cancel := timeouts.ForUpdate(meta.(*clients.Client).StopContext, d)
defer cancel()

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

existing, err := client.Get(ctx, *id)
if err != nil {
return fmt.Errorf("retrieving %s: %+v", id, err)
}

payload := existing.Model

if d.HasChange("application_definition_id") {
payload.Properties.ApplicationDefinitionId = pointer.To(d.Get("application_definition_id").(string))
}

if d.HasChange("tags") {
payload.Tags = tags.Expand(d.Get("tags").(map[string]interface{}))
}

params, err := expandManagedApplicationParameters(d)
if err != nil {
if !features.FourPointOhBeta() {
return fmt.Errorf("expanding `parameters` or `parameter_values`: %+v", err)
}
return fmt.Errorf("expanding `parameter_values`: %+v", err)
}
payload.Properties.Parameters = pointer.To(interface{}(params))

err = client.CreateOrUpdateThenPoll(ctx, *id, *payload)
if err != nil {
return fmt.Errorf("updating %s: %+v", id, err)
}

return resourceManagedApplicationRead(d, meta)
}

func resourceManagedApplicationRead(d *pluginsdk.ResourceData, meta interface{}) error {
client := meta.(*clients.Client).ManagedApplication.ApplicationClient
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
Expand Down

0 comments on commit ac13fcc

Please sign in to comment.