-
Notifications
You must be signed in to change notification settings - Fork 4.7k
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_security_center_storage_defender
#23242
Changes from 1 commit
de375a8
f18366d
4099eb4
b120a92
664e82b
28292a0
fd9b515
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -199,6 +199,7 @@ func SupportedTypedServices() []sdk.TypedServiceRegistration { | |
vmware.Registration{}, | ||
voiceservices.Registration{}, | ||
web.Registration{}, | ||
securitycenter.Registration{}, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Alphabetical ordering |
||
} | ||
services = append(services, autoRegisteredTypedServices()...) | ||
return services | ||
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,314 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
package securitycenter | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"context" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"fmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"time" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hashicorp/go-azure-helpers/lang/pointer" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hashicorp/go-azure-helpers/lang/response" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hashicorp/go-azure-helpers/resourcemanager/commonids" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hashicorp/go-azure-sdk/resource-manager/security/2022-12-01-preview/defenderforstorage" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hashicorp/terraform-provider-azurerm/helpers/tf" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hashicorp/terraform-provider-azurerm/internal/sdk" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/pluginsdk" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hashicorp/terraform-provider-azurerm/internal/tf/validation" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type StorageDefenderResource struct{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
type StorageDefenderModel struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
StorageAccountId string `tfschema:"storage_account_id"` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Enabled bool `tfschema:"enabled"` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OverrideSubscriptionSettings bool `tfschema:"override_subscription_settings_enabled"` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MalwareScanningOnUploadEnabled bool `tfschema:"malware_scanning_on_upload_enabled"` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MalwareScanningOnUploadCapPerMon int64 `tfschema:"malware_scanning_on_upload_cap_gb_per_month"` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SensitiveDataDiscoveryEnabled bool `tfschema:"sensitive_data_discovery_enabled"` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var _ sdk.ResourceWithUpdate = StorageDefenderResource{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (s StorageDefenderResource) IDValidationFunc() pluginsdk.SchemaValidateFunc { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return commonids.ValidateScopeID | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we extend this to parse the |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (s StorageDefenderResource) ModelObject() interface{} { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return &StorageDefenderModel{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (s StorageDefenderResource) ResourceType() string { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return "azurerm_security_center_storage_defender" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (s StorageDefenderResource) Arguments() map[string]*schema.Schema { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return map[string]*schema.Schema{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"storage_account_id": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Type: pluginsdk.TypeString, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Required: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ForceNew: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ValidateFunc: commonids.ValidateStorageAccountID, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"enabled": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Type: pluginsdk.TypeBool, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Required: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We don't expose the This field should be controlled purely by the creation of it |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"override_subscription_settings_enabled": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Type: pluginsdk.TypeBool, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Optional: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Default: false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"malware_scanning_on_upload_enabled": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Type: pluginsdk.TypeBool, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Optional: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Default: false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"malware_scanning_on_upload_cap_gb_per_month": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Type: pluginsdk.TypeInt, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Optional: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Default: -1, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ValidateFunc: func(i interface{}, s string) (warnings []string, errors []error) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// it requires -1 or greater than 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
v, ok := i.(int) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if !ok { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
errors = append(errors, fmt.Errorf("expected type of %s to be integer", s)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return warnings, errors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if v == -1 { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return warnings, errors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return validation.IntAtLeast(-1)(i, s) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What does There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. the service does not accept 0, and -1 means no limit on that cap. Do we need to map user input There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this can be more clearly/simply achieved with:
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"sensitive_data_discovery_enabled": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Type: pluginsdk.TypeBool, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Optional: true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Default: false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (s StorageDefenderResource) Attributes() map[string]*schema.Schema { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return map[string]*schema.Schema{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (s StorageDefenderResource) Create() sdk.ResourceFunc { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return sdk.ResourceFunc{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Timeout: 10 * time.Minute, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we bump this up to |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var plan StorageDefenderModel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err := metadata.Decode(&plan); err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("decoding: %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client := metadata.Client.SecurityCenter.DefenderForStorageClient | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id := commonids.NewScopeID(plan.StorageAccountId) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resp, err := client.Get(ctx, id) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if !response.WasNotFound(resp.HttpResponse) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("checking for existing %s: %+v", id, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if !response.WasNotFound(resp.HttpResponse) && | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resp.Model != nil && resp.Model.Properties != nil && resp.Model.Properties.IsEnabled != nil && *resp.Model.Properties.IsEnabled { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return tf.ImportAsExistsError(s.ResourceType(), id.ID()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
input := defenderforstorage.DefenderForStorageSetting{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Properties: &defenderforstorage.DefenderForStorageSettingProperties{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IsEnabled: pointer.To(plan.Enabled), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This needs to be defaulted to |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OverrideSubscriptionLevelSettings: pointer.To(plan.OverrideSubscriptionSettings), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MalwareScanning: &defenderforstorage.MalwareScanningProperties{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OnUpload: &defenderforstorage.OnUploadProperties{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IsEnabled: pointer.To(plan.MalwareScanningOnUploadEnabled), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
CapGBPerMonth: pointer.To(plan.MalwareScanningOnUploadCapPerMon), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SensitiveDataDiscovery: &defenderforstorage.SensitiveDataDiscoveryProperties{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IsEnabled: pointer.To(plan.SensitiveDataDiscoveryEnabled), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err = client.Create(ctx, id, input) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("creating: %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
metadata.SetID(id) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (s StorageDefenderResource) Update() sdk.ResourceFunc { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return sdk.ResourceFunc{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Timeout: 10 * time.Minute, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var plan StorageDefenderModel | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err := metadata.Decode(&plan); err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("decoding: %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client := metadata.Client.SecurityCenter.DefenderForStorageClient | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id, err := commonids.ParseScopeID(metadata.ResourceData.Id()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("decoding %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resp, err := client.Get(ctx, *id) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("retrieving %s: %+v", *id, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
model := resp.Model | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if model == nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("retrieving %s: model was nil", *id) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
prop := model.Properties | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if prop == nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("retrieving %s: properties was nil", *id) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if metadata.ResourceData.HasChange("enabled") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
prop.IsEnabled = pointer.To(plan.Enabled) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. As mentioned above this shouldn't be user configurable.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if metadata.ResourceData.HasChange("override_subscription_settings_enabled") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
prop.OverrideSubscriptionLevelSettings = pointer.To(plan.OverrideSubscriptionSettings) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if prop.MalwareScanning == nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
prop.MalwareScanning = &defenderforstorage.MalwareScanningProperties{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if prop.MalwareScanning.OnUpload == nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
prop.MalwareScanning.OnUpload = &defenderforstorage.OnUploadProperties{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if metadata.ResourceData.HasChange("malware_scanning_on_upload_enabled") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
prop.MalwareScanning.OnUpload.IsEnabled = pointer.To(plan.MalwareScanningOnUploadEnabled) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if metadata.ResourceData.HasChange("malware_scanning_on_upload_cap_gb_per_month") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
prop.MalwareScanning.OnUpload.CapGBPerMonth = pointer.To(plan.MalwareScanningOnUploadCapPerMon) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if prop.SensitiveDataDiscovery == nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
prop.SensitiveDataDiscovery = &defenderforstorage.SensitiveDataDiscoveryProperties{} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if metadata.ResourceData.HasChange("sensitive_data_discovery_enabled") { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
prop.SensitiveDataDiscovery.IsEnabled = pointer.To(plan.SensitiveDataDiscoveryEnabled) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
input := defenderforstorage.DefenderForStorageSetting{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Properties: prop, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err = client.Create(ctx, *id, input) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("updating: %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (s StorageDefenderResource) Read() sdk.ResourceFunc { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return sdk.ResourceFunc{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Timeout: 5 * time.Minute, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client := metadata.Client.SecurityCenter.DefenderForStorageClient | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id, err := commonids.ParseScopeID(metadata.ResourceData.Id()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("parsing %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resp, err := client.Get(ctx, *id) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if response.WasNotFound(resp.HttpResponse) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return metadata.MarkAsGone(id) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("reading %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
state := StorageDefenderModel{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
StorageAccountId: id.ID(), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since this is a scoped ID, we need to parse the scope part of
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if model := resp.Model; model != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if prop := model.Properties; prop != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
state.Enabled = pointer.From(prop.IsEnabled) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here we should check if it's disabled, and if so then mark the resource as gone. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
state.OverrideSubscriptionSettings = pointer.From(prop.OverrideSubscriptionLevelSettings) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ms := prop.MalwareScanning; ms != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if onUpload := ms.OnUpload; onUpload != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
state.MalwareScanningOnUploadEnabled = pointer.From(onUpload.IsEnabled) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
state.MalwareScanningOnUploadCapPerMon = pointer.From(onUpload.CapGBPerMonth) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if sdd := prop.SensitiveDataDiscovery; sdd != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
state.SensitiveDataDiscoveryEnabled = pointer.From(sdd.IsEnabled) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return metadata.Encode(&state) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (s StorageDefenderResource) Delete() sdk.ResourceFunc { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return sdk.ResourceFunc{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Timeout: 10 * time.Minute, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Func: func(ctx context.Context, metadata sdk.ResourceMetaData) error { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client := metadata.Client.SecurityCenter.DefenderForStorageClient | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
id, err := commonids.ParseScopeID(metadata.ResourceData.Id()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("parsing %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
resp, err := client.Get(ctx, *id) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if !response.WasNotFound(resp.HttpResponse) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("reading %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// if the resource has never been created, it returns 404. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// once created, it could only be set to disable. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if response.WasNotFound(resp.HttpResponse) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the resource doesn't exist (or in this case disabled) when the delete is run we should raise an error instead of returning nil
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
input := defenderforstorage.DefenderForStorageSetting{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Properties: &defenderforstorage.DefenderForStorageSettingProperties{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
IsEnabled: pointer.To(false), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_, err = client.Create(ctx, *id, input) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return fmt.Errorf("deleting %+v", err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For future reference these have to go into their own PR to avoid conflicts. So can you please revert this and also do a rebase since the
go-azure-sdk
has already been updated since the opening of this PR.