From a97c243313f42782ffb9a62cd140e0521684a021 Mon Sep 17 00:00:00 2001 From: Timothy-Yao Date: Mon, 25 Nov 2024 16:45:28 -0600 Subject: [PATCH 1/2] fix: hot fix to include properties from 5579 - include the following properties to scc_instance_settings: - source_description - source_name --- .../scc/resource_ibm_scc_instance_settings.go | 30 +++++++++++++------ ...resource_ibm_scc_instance_settings_test.go | 11 +++---- .../r/scc_instance_settings.html.markdown | 4 ++- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/ibm/service/scc/resource_ibm_scc_instance_settings.go b/ibm/service/scc/resource_ibm_scc_instance_settings.go index f501c009192..8208971baaa 100644 --- a/ibm/service/scc/resource_ibm_scc_instance_settings.go +++ b/ibm/service/scc/resource_ibm_scc_instance_settings.go @@ -34,8 +34,21 @@ func ResourceIbmSccInstanceSettings() *schema.Resource { "instance_crn": &schema.Schema{ Type: schema.TypeString, Optional: true, + Computed: true, Description: "The Event Notifications instance CRN.", }, + "source_description": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "The description of the source in Event Notifications connected Security and Compliance Center", + }, + "source_name": &schema.Schema{ + Type: schema.TypeString, + Optional: true, + Computed: true, + Description: "The name of the Event Notifications source connected Security and Compliance Center instance CRN.", + }, "updated_on": &schema.Schema{ Type: schema.TypeString, Computed: true, @@ -123,11 +136,8 @@ func resourceIbmSccInstanceSettingsCreate(context context.Context, d *schema.Res return diag.FromErr(err) } eventNotificationsModel = eventNotificationsData - eventNotificationsModel.SourceName = core.StringPtr("compliance") - eventNotificationsModel.SourceDescription = core.StringPtr("This source is used for integration with IBM Cloud Security and Compliance Center.") } else { eventNotificationsModel = &securityandcompliancecenterapiv3.EventNotifications{} - eventNotificationsModel.InstanceCrn = core.StringPtr("") } updateSettingsOptions.SetEventNotifications(eventNotificationsModel) @@ -139,8 +149,7 @@ func resourceIbmSccInstanceSettingsCreate(context context.Context, d *schema.Res } objectStorageModel = objectStorageData } else { - objectStorageModel := &securityandcompliancecenterapiv3.ObjectStorage{} - objectStorageModel.InstanceCrn = core.StringPtr("") + objectStorageModel = &securityandcompliancecenterapiv3.ObjectStorage{} } updateSettingsOptions.SetObjectStorage(objectStorageModel) @@ -217,10 +226,6 @@ func resourceIbmSccInstanceSettingsUpdate(context context.Context, d *schema.Res if err != nil { return diag.FromErr(err) } - if eventNotifications.InstanceCrn != nil && *eventNotifications.InstanceCrn != "" { - eventNotifications.SourceName = core.StringPtr("compliance") - eventNotifications.SourceDescription = core.StringPtr("This source is used for integration with IBM Cloud Security and Compliance Center.") - } updateSettingsOptions.SetEventNotifications(eventNotifications) hasChange = true } @@ -233,6 +238,7 @@ func resourceIbmSccInstanceSettingsUpdate(context context.Context, d *schema.Res hasChange = true } + log.Printf("[INFO] UpdateSettingsWithContext payload EventNotifications: %#v\n", updateSettingsOptions.EventNotifications) if hasChange { _, response, err := adminClient.UpdateSettingsWithContext(context, updateSettingsOptions) if err != nil { @@ -266,6 +272,12 @@ func resourceIbmSccInstanceSettingsMapToEventNotifications(modelMap map[string]i if modelMap["source_id"] != nil && modelMap["source_id"].(string) != "" { model.SourceID = core.StringPtr(modelMap["source_id"].(string)) } + if modelMap["source_name"] != nil && modelMap["source_name"].(string) != "" { + model.SourceName = core.StringPtr(modelMap["source_name"].(string)) + } + if modelMap["source_description"] != nil && modelMap["source_description"].(string) != "" { + model.SourceDescription = core.StringPtr(modelMap["source_description"].(string)) + } return model, nil } diff --git a/ibm/service/scc/resource_ibm_scc_instance_settings_test.go b/ibm/service/scc/resource_ibm_scc_instance_settings_test.go index c74b3947d84..c81316db205 100644 --- a/ibm/service/scc/resource_ibm_scc_instance_settings_test.go +++ b/ibm/service/scc/resource_ibm_scc_instance_settings_test.go @@ -24,7 +24,7 @@ func TestAccIbmSccInstanceSettingsBasic(t *testing.T) { Providers: acc.TestAccProviders, CheckDestroy: testAccCheckIbmSccInstanceSettingsDestroy, Steps: []resource.TestStep{ - resource.TestStep{ + { Config: testAccCheckIbmSccInstanceSettingsConfigBasic(acc.SccInstanceID), Check: resource.ComposeAggregateTestCheckFunc( testAccCheckIbmSccInstanceSettingsExists("ibm_scc_instance_settings.scc_instance_settings_instance", conf), @@ -42,19 +42,19 @@ func TestAccIbmSccInstanceSettingsAllArgs(t *testing.T) { Providers: acc.TestAccProviders, CheckDestroy: testAccCheckIbmSccInstanceSettingsDestroy, Steps: []resource.TestStep{ - resource.TestStep{ + { Config: testAccCheckIbmSccInstanceSettingsConfigBasic(acc.SccInstanceID), Check: resource.ComposeAggregateTestCheckFunc( testAccCheckIbmSccInstanceSettingsExists("ibm_scc_instance_settings.scc_instance_settings_instance", conf), ), }, - resource.TestStep{ + { Config: testAccCheckIbmSccInstanceSettingsConfig(acc.SccInstanceID, acc.SccEventNotificationsCRN, acc.SccObjectStorageCRN, acc.SccObjectStorageBucket), Check: resource.ComposeAggregateTestCheckFunc( testAccCheckIbmSccInstanceSettingsExists("ibm_scc_instance_settings.scc_instance_settings_instance", conf), ), }, - resource.TestStep{ + { ResourceName: "ibm_scc_instance_settings.scc_instance_settings_instance", ImportState: true, ImportStateVerify: true, @@ -79,6 +79,8 @@ func testAccCheckIbmSccInstanceSettingsConfig(instanceID, enInstanceCRN, objStor instance_id = "%s" event_notifications { instance_crn = "%s" + source_description = "This source is used by the scc instance" + source_name = "scc compliance" } object_storage { instance_crn = "%s" @@ -89,7 +91,6 @@ func testAccCheckIbmSccInstanceSettingsConfig(instanceID, enInstanceCRN, objStor } func testAccCheckIbmSccInstanceSettingsExists(n string, obj securityandcompliancecenterapiv3.Settings) resource.TestCheckFunc { - return func(s *terraform.State) error { _, ok := s.RootModule().Resources[n] if !ok { diff --git a/website/docs/r/scc_instance_settings.html.markdown b/website/docs/r/scc_instance_settings.html.markdown index 35f6fc9a91c..0bbfad45558 100644 --- a/website/docs/r/scc_instance_settings.html.markdown +++ b/website/docs/r/scc_instance_settings.html.markdown @@ -39,6 +39,8 @@ Nested schema for **event_notifications**: * `source_id` - (Computed, String) The connected Security and Compliance Center instance CRN. * Constraints: The maximum length is `512` characters. The minimum length is `1` character. The value must match regular expression `/([A-Za-z0-9]+(:[A-Za-z0-9]+)+)/`. * `updated_on` - (Optional, String) The date when the Event Notifications connection was updated. + * `source_description` - (Optional,Computed, String) The description of the Event Notifications connection source. + * `source_name` - (Optional,Computed, String) The name of the Event Notifications connection source. * `object_storage` - (Optional, List) The Cloud Object Storage settings. Nested schema for **object_storage**: * `bucket` - (Optional, String) The connected Cloud Object Storage bucket name. @@ -69,4 +71,4 @@ $ terraform import ibm_scc_instance_settings.scc_instance_settings # Example ```bash $ terraform import ibm_scc_instance_settings.scc_instance_settings 00000000-1111-2222-3333-444444444444 -``` \ No newline at end of file +``` From 849b51eeae85a68a4e63e3ea11f39b2627c2ce1e Mon Sep 17 00:00:00 2001 From: Timothy-Yao Date: Mon, 25 Nov 2024 18:24:48 -0600 Subject: [PATCH 2/2] added some validation updates --- .../scc/resource_ibm_scc_instance_settings.go | 12 ++++++++++-- .../scc/resource_ibm_scc_instance_settings_test.go | 5 ++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/ibm/service/scc/resource_ibm_scc_instance_settings.go b/ibm/service/scc/resource_ibm_scc_instance_settings.go index 8208971baaa..e96e7c97d19 100644 --- a/ibm/service/scc/resource_ibm_scc_instance_settings.go +++ b/ibm/service/scc/resource_ibm_scc_instance_settings.go @@ -46,7 +46,6 @@ func ResourceIbmSccInstanceSettings() *schema.Resource { "source_name": &schema.Schema{ Type: schema.TypeString, Optional: true, - Computed: true, Description: "The name of the Event Notifications source connected Security and Compliance Center instance CRN.", }, "updated_on": &schema.Schema{ @@ -192,6 +191,13 @@ func resourceIbmSccInstanceSettingsRead(context context.Context, d *schema.Resou if err != nil { return diag.FromErr(err) } + if _, ok := eventNotificationsMap["source_name"]; !ok { + eventNotificationsData, enErr := resourceIbmSccInstanceSettingsMapToEventNotifications(d.Get("event_notifications.0").(map[string]interface{})) + if enErr == nil && core.StringNilMapper(eventNotificationsData.SourceName) != "" { + eventNotificationsMap["source_name"] = eventNotificationsData.SourceName + log.Print("[WARN] event_notifications.source_name grabbed from preexisting state\n") + } + } if err = d.Set("event_notifications", []map[string]interface{}{eventNotificationsMap}); err != nil { return diag.FromErr(flex.FmtErrorf("Error setting event_notifications: %s", err)) } @@ -238,7 +244,6 @@ func resourceIbmSccInstanceSettingsUpdate(context context.Context, d *schema.Res hasChange = true } - log.Printf("[INFO] UpdateSettingsWithContext payload EventNotifications: %#v\n", updateSettingsOptions.EventNotifications) if hasChange { _, response, err := adminClient.UpdateSettingsWithContext(context, updateSettingsOptions) if err != nil { @@ -278,6 +283,9 @@ func resourceIbmSccInstanceSettingsMapToEventNotifications(modelMap map[string]i if modelMap["source_description"] != nil && modelMap["source_description"].(string) != "" { model.SourceDescription = core.StringPtr(modelMap["source_description"].(string)) } + if core.StringNilMapper(model.InstanceCrn) != "" && core.StringNilMapper(model.SourceName) == "" { + return model, errors.New("event_notifications.source_name needs to be defined along with event_notifications.instance_crn") + } return model, nil } diff --git a/ibm/service/scc/resource_ibm_scc_instance_settings_test.go b/ibm/service/scc/resource_ibm_scc_instance_settings_test.go index c81316db205..d8914a4d634 100644 --- a/ibm/service/scc/resource_ibm_scc_instance_settings_test.go +++ b/ibm/service/scc/resource_ibm_scc_instance_settings_test.go @@ -66,7 +66,7 @@ func TestAccIbmSccInstanceSettingsAllArgs(t *testing.T) { func testAccCheckIbmSccInstanceSettingsConfigBasic(instanceID string) string { return fmt.Sprintf(` resource "ibm_scc_instance_settings" "scc_instance_settings_instance" { - instance_id = "%s" + instance_id = "%s" event_notifications { } object_storage { } } @@ -79,8 +79,7 @@ func testAccCheckIbmSccInstanceSettingsConfig(instanceID, enInstanceCRN, objStor instance_id = "%s" event_notifications { instance_crn = "%s" - source_description = "This source is used by the scc instance" - source_name = "scc compliance" + source_name = "scc compliance" } object_storage { instance_crn = "%s"