From 956abc7ad514769dafbf3573183a4d1ae15e77b0 Mon Sep 17 00:00:00 2001 From: Divya Singh Date: Thu, 25 Sep 2025 11:18:21 +0530 Subject: [PATCH 1/3] feat: app configuration destination, subscription and template, Webhook destination test support --- go.mod | 4 +- go.sum | 4 +- ibm/provider/provider.go | 222 ++++++------ ...e_ibm_en_app_configuration_subscription.go | 161 +++++++++ ..._en_app_configuration_subscription_test.go | 91 +++++ ...ource_ibm_en_app_configuration_template.go | 128 +++++++ ..._ibm_en_app_configuration_template_test.go | 103 ++++++ ...ce_ibm_en_destination_app_configuration.go | 229 ++++++++++++ ...m_en_destination_app_configuration_test.go | 70 ++++ ...ource_ibm_en_app_configuration_template.go | 276 +++++++++++++++ ..._ibm_en_app_configuration_template_test.go | 145 ++++++++ ...ce_ibm_en_destination_app_configuration.go | 335 ++++++++++++++++++ ...m_en_destination_app_configuration_test.go | 152 ++++++++ .../resource_ibm_en_destination_webhook.go | 107 +++++- ...e_ibm_en_subscription_app_configuration.go | 333 +++++++++++++++++ ..._en_subscription_app_configuration_test.go | 173 +++++++++ ...n_app_configuration_template.html.markdown | 46 +++ ...estination_app_configuration.html.markdown | 64 ++++ .../d/en_pre_defined_template.html.markdown | 2 +- ...bscription_app_configuration.html.markdown | 55 +++ ...n_app_configuration_template.html.markdown | 74 ++++ ...estination_app_configuration.html.markdown | 88 +++++ .../r/en_destination_webhook.html.markdown | 5 +- ...bscription_app_configuration.html.markdown | 93 +++++ 24 files changed, 2838 insertions(+), 122 deletions(-) create mode 100644 ibm/service/eventnotification/data_source_ibm_en_app_configuration_subscription.go create mode 100644 ibm/service/eventnotification/data_source_ibm_en_app_configuration_subscription_test.go create mode 100644 ibm/service/eventnotification/data_source_ibm_en_app_configuration_template.go create mode 100644 ibm/service/eventnotification/data_source_ibm_en_app_configuration_template_test.go create mode 100644 ibm/service/eventnotification/data_source_ibm_en_destination_app_configuration.go create mode 100644 ibm/service/eventnotification/data_source_ibm_en_destination_app_configuration_test.go create mode 100644 ibm/service/eventnotification/resource_ibm_en_app_configuration_template.go create mode 100644 ibm/service/eventnotification/resource_ibm_en_app_configuration_template_test.go create mode 100644 ibm/service/eventnotification/resource_ibm_en_destination_app_configuration.go create mode 100644 ibm/service/eventnotification/resource_ibm_en_destination_app_configuration_test.go create mode 100644 ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration.go create mode 100644 ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration_test.go create mode 100644 website/docs/d/en_app_configuration_template.html.markdown create mode 100644 website/docs/d/en_destination_app_configuration.html.markdown create mode 100644 website/docs/d/en_subscription_app_configuration.html.markdown create mode 100644 website/docs/r/en_app_configuration_template.html.markdown create mode 100644 website/docs/r/en_destination_app_configuration.html.markdown create mode 100644 website/docs/r/en_subscription_app_configuration.html.markdown diff --git a/go.mod b/go.mod index 8f0db2bb0b..9d2f8b808e 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/IBM/configuration-aggregator-go-sdk v0.0.2 github.com/IBM/container-registry-go-sdk v1.2.0 github.com/IBM/continuous-delivery-go-sdk/v2 v2.0.6 - github.com/IBM/event-notifications-go-admin-sdk v0.18.0 + github.com/IBM/event-notifications-go-admin-sdk v0.20.0 github.com/IBM/eventstreams-go-sdk v1.4.0 github.com/IBM/go-sdk-core/v5 v5.21.0 github.com/IBM/ibm-backup-recovery-sdk-go v1.0.3 @@ -229,6 +229,8 @@ require ( replace github.com/softlayer/softlayer-go v1.0.3 => github.com/IBM-Cloud/softlayer-go v1.0.5-tf +replace github.com/IBM/event-notifications-go-admin-sdk v0.18.0 => /Users/divyasingh/Documents/EN-SDK/IBM-SDK/event-notifications-go-admin-sdk + // add sdk changes. replace github.com/portworx/sched-ops v0.0.0-20200831185134-3e8010dc7056 => github.com/portworx/sched-ops v0.20.4-openstorage-rc3 // required by rook v1.7 diff --git a/go.sum b/go.sum index 0d7ac5c463..e47706e885 100644 --- a/go.sum +++ b/go.sum @@ -116,8 +116,8 @@ github.com/IBM/container-registry-go-sdk v1.2.0 h1:DX08GSKFvgCcUne9rWwb9+UttevV4 github.com/IBM/container-registry-go-sdk v1.2.0/go.mod h1:fE1iNfehccXBx1wmX/RUWksDteWOOOXJFtHWYlT4zKk= github.com/IBM/continuous-delivery-go-sdk/v2 v2.0.6 h1:CdJWGVzcHngf6un5N2C4KDgIzqViA2Md6pSeZNZzsLQ= github.com/IBM/continuous-delivery-go-sdk/v2 v2.0.6/go.mod h1:Iibf+4gRasEZHakDgnMm7TOX87xex0L+DfghUclcmcg= -github.com/IBM/event-notifications-go-admin-sdk v0.18.0 h1:G4230wYVCjHnHFEcingfMVznjSJeUoSWzyEMsEFYCmo= -github.com/IBM/event-notifications-go-admin-sdk v0.18.0/go.mod h1:9fG6k1gYRqiChZvmn1iRIjaKCXuDBCOlPH6xPJN+mMU= +github.com/IBM/event-notifications-go-admin-sdk v0.20.0 h1:IuIWVLQuNfIfuw/ZRqu06x85zIKq6HiMzT4vlgPeJTw= +github.com/IBM/event-notifications-go-admin-sdk v0.20.0/go.mod h1:9fG6k1gYRqiChZvmn1iRIjaKCXuDBCOlPH6xPJN+mMU= github.com/IBM/eventstreams-go-sdk v1.4.0 h1:yS/Ns29sBOe8W2tynQmz9HTKqQZ0ckse4Py5Oy/F2rM= github.com/IBM/eventstreams-go-sdk v1.4.0/go.mod h1:2tuAxaYLctfqfr5jvyqSrxxEQGMwYPm3yJGWSj85YVQ= github.com/IBM/go-sdk-core/v5 v5.0.0/go.mod h1:vyNdbFujJtdTj9HbihtvKwwS3k/GKSKpOx9ZIQ6MWDY= diff --git a/ibm/provider/provider.go b/ibm/provider/provider.go index 7f5e66f36e..f54e4a94e4 100644 --- a/ibm/provider/provider.go +++ b/ibm/provider/provider.go @@ -957,65 +957,68 @@ func Provider() *schema.Provider { "ibm_cbr_rule": contextbasedrestrictions.DataSourceIBMCbrRule(), // Added for Event Notifications - "ibm_en_source": eventnotification.DataSourceIBMEnSource(), - "ibm_en_destinations": eventnotification.DataSourceIBMEnDestinations(), - "ibm_en_topic": eventnotification.DataSourceIBMEnTopic(), - "ibm_en_topics": eventnotification.DataSourceIBMEnTopics(), - "ibm_en_subscriptions": eventnotification.DataSourceIBMEnSubscriptions(), - "ibm_en_destination_webhook": eventnotification.DataSourceIBMEnWebhookDestination(), - "ibm_en_destination_android": eventnotification.DataSourceIBMEnFCMDestination(), - "ibm_en_destination_ios": eventnotification.DataSourceIBMEnAPNSDestination(), - "ibm_en_destination_chrome": eventnotification.DataSourceIBMEnChromeDestination(), - "ibm_en_destination_firefox": eventnotification.DataSourceIBMEnFirefoxDestination(), - "ibm_en_destination_slack": eventnotification.DataSourceIBMEnSlackDestination(), - "ibm_en_subscription_sms": eventnotification.DataSourceIBMEnSMSSubscription(), - "ibm_en_subscription_email": eventnotification.DataSourceIBMEnEmailSubscription(), - "ibm_en_subscription_webhook": eventnotification.DataSourceIBMEnWebhookSubscription(), - "ibm_en_subscription_android": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_subscription_ios": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_subscription_chrome": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_subscription_firefox": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_subscription_slack": eventnotification.DataSourceIBMEnSlackSubscription(), - "ibm_en_subscription_safari": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_destination_safari": eventnotification.DataSourceIBMEnSafariDestination(), - "ibm_en_destination_msteams": eventnotification.DataSourceIBMEnMSTeamsDestination(), - "ibm_en_subscription_msteams": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_destination_pagerduty": eventnotification.DataSourceIBMEnPagerDutyDestination(), - "ibm_en_subscription_pagerduty": eventnotification.DataSourceIBMEnPagerDutySubscription(), - "ibm_en_integration": eventnotification.DataSourceIBMEnIntegration(), - "ibm_en_integrations": eventnotification.DataSourceIBMEnIntegrations(), - "ibm_en_destination_sn": eventnotification.DataSourceIBMEnServiceNowDestination(), - "ibm_en_subscription_sn": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_destination_ce": eventnotification.DataSourceIBMEnCodeEngineDestination(), - "ibm_en_subscription_ce": eventnotification.DataSourceIBMEnCodeEngineSubscription(), - "ibm_en_destination_cos": eventnotification.DataSourceIBMEnCOSDestination(), - "ibm_en_subscription_cos": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_destination_huawei": eventnotification.DataSourceIBMEnHuaweiDestination(), - "ibm_en_subscription_huawei": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_sources": eventnotification.DataSourceIBMEnSources(), - "ibm_en_destination_custom_email": eventnotification.DataSourceIBMEnCustomEmailDestination(), - "ibm_en_subscription_custom_email": eventnotification.DataSourceIBMEnCustomEmailSubscription(), - "ibm_en_email_template": eventnotification.DataSourceIBMEnEmailTemplate(), - "ibm_en_email_templates": eventnotification.DataSourceIBMEnTemplates(), - "ibm_en_destination_custom_sms": eventnotification.DataSourceIBMEnCustomSMSDestination(), - "ibm_en_subscription_custom_sms": eventnotification.DataSourceIBMEnCustomSMSSubscription(), - "ibm_en_integration_cos": eventnotification.DataSourceIBMEnCOSIntegration(), - "ibm_en_smtp_configuration": eventnotification.DataSourceIBMEnSMTPConfiguration(), - "ibm_en_smtp_configurations": eventnotification.DataSourceIBMEnSMTPCOnfigurations(), - "ibm_en_smtp_user": eventnotification.DataSourceIBMEnSMTPUser(), - "ibm_en_smtp_users": eventnotification.DataSourceIBMEnSMTPUsers(), - "ibm_en_slack_template": eventnotification.DataSourceIBMEnSlackTemplate(), - "ibm_en_metrics": eventnotification.DataSourceIBMEnMetrics(), - "ibm_en_smtp_allowed_ips": eventnotification.DataSourceIBMEnSMTPAllowedIps(), - "ibm_en_webhook_template": eventnotification.DataSourceIBMEnWebhookTemplate(), - "ibm_en_subscription_scheduler": eventnotification.DataSourceIBMEnFCMSubscription(), - "ibm_en_pagerduty_template": eventnotification.DataSourceIBMEnPagerDutyTemplate(), - "ibm_en_destination_event_streams": eventnotification.DataSourceIBMEnEventStreamsDestination(), - "ibm_en_subscription_event_streams": eventnotification.DataSourceIBMEnEventStreamsSubscription(), - "ibm_en_event_streams_template": eventnotification.DataSourceIBMEnEventStreamsTemplate(), - "ibm_en_pre_defined_template": eventnotification.DataSourceIBMEnPreDefinedTemplate(), - "ibm_en_pre_defined_templates": eventnotification.DataSourceIBMEnPreDefinedTemplates(), - "ibm_en_code_engine_template": eventnotification.DataSourceIBMEnCodeEngineTemplate(), + "ibm_en_source": eventnotification.DataSourceIBMEnSource(), + "ibm_en_destinations": eventnotification.DataSourceIBMEnDestinations(), + "ibm_en_topic": eventnotification.DataSourceIBMEnTopic(), + "ibm_en_topics": eventnotification.DataSourceIBMEnTopics(), + "ibm_en_subscriptions": eventnotification.DataSourceIBMEnSubscriptions(), + "ibm_en_destination_webhook": eventnotification.DataSourceIBMEnWebhookDestination(), + "ibm_en_destination_android": eventnotification.DataSourceIBMEnFCMDestination(), + "ibm_en_destination_ios": eventnotification.DataSourceIBMEnAPNSDestination(), + "ibm_en_destination_chrome": eventnotification.DataSourceIBMEnChromeDestination(), + "ibm_en_destination_firefox": eventnotification.DataSourceIBMEnFirefoxDestination(), + "ibm_en_destination_slack": eventnotification.DataSourceIBMEnSlackDestination(), + "ibm_en_subscription_sms": eventnotification.DataSourceIBMEnSMSSubscription(), + "ibm_en_subscription_email": eventnotification.DataSourceIBMEnEmailSubscription(), + "ibm_en_subscription_webhook": eventnotification.DataSourceIBMEnWebhookSubscription(), + "ibm_en_subscription_android": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_subscription_ios": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_subscription_chrome": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_subscription_firefox": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_subscription_slack": eventnotification.DataSourceIBMEnSlackSubscription(), + "ibm_en_subscription_safari": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_destination_safari": eventnotification.DataSourceIBMEnSafariDestination(), + "ibm_en_destination_msteams": eventnotification.DataSourceIBMEnMSTeamsDestination(), + "ibm_en_subscription_msteams": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_destination_pagerduty": eventnotification.DataSourceIBMEnPagerDutyDestination(), + "ibm_en_subscription_pagerduty": eventnotification.DataSourceIBMEnPagerDutySubscription(), + "ibm_en_integration": eventnotification.DataSourceIBMEnIntegration(), + "ibm_en_integrations": eventnotification.DataSourceIBMEnIntegrations(), + "ibm_en_destination_sn": eventnotification.DataSourceIBMEnServiceNowDestination(), + "ibm_en_subscription_sn": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_destination_ce": eventnotification.DataSourceIBMEnCodeEngineDestination(), + "ibm_en_subscription_ce": eventnotification.DataSourceIBMEnCodeEngineSubscription(), + "ibm_en_destination_cos": eventnotification.DataSourceIBMEnCOSDestination(), + "ibm_en_subscription_cos": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_destination_huawei": eventnotification.DataSourceIBMEnHuaweiDestination(), + "ibm_en_subscription_huawei": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_sources": eventnotification.DataSourceIBMEnSources(), + "ibm_en_destination_custom_email": eventnotification.DataSourceIBMEnCustomEmailDestination(), + "ibm_en_subscription_custom_email": eventnotification.DataSourceIBMEnCustomEmailSubscription(), + "ibm_en_email_template": eventnotification.DataSourceIBMEnEmailTemplate(), + "ibm_en_email_templates": eventnotification.DataSourceIBMEnTemplates(), + "ibm_en_destination_custom_sms": eventnotification.DataSourceIBMEnCustomSMSDestination(), + "ibm_en_subscription_custom_sms": eventnotification.DataSourceIBMEnCustomSMSSubscription(), + "ibm_en_integration_cos": eventnotification.DataSourceIBMEnCOSIntegration(), + "ibm_en_smtp_configuration": eventnotification.DataSourceIBMEnSMTPConfiguration(), + "ibm_en_smtp_configurations": eventnotification.DataSourceIBMEnSMTPCOnfigurations(), + "ibm_en_smtp_user": eventnotification.DataSourceIBMEnSMTPUser(), + "ibm_en_smtp_users": eventnotification.DataSourceIBMEnSMTPUsers(), + "ibm_en_slack_template": eventnotification.DataSourceIBMEnSlackTemplate(), + "ibm_en_metrics": eventnotification.DataSourceIBMEnMetrics(), + "ibm_en_smtp_allowed_ips": eventnotification.DataSourceIBMEnSMTPAllowedIps(), + "ibm_en_webhook_template": eventnotification.DataSourceIBMEnWebhookTemplate(), + "ibm_en_subscription_scheduler": eventnotification.DataSourceIBMEnFCMSubscription(), + "ibm_en_pagerduty_template": eventnotification.DataSourceIBMEnPagerDutyTemplate(), + "ibm_en_destination_event_streams": eventnotification.DataSourceIBMEnEventStreamsDestination(), + "ibm_en_subscription_event_streams": eventnotification.DataSourceIBMEnEventStreamsSubscription(), + "ibm_en_event_streams_template": eventnotification.DataSourceIBMEnEventStreamsTemplate(), + "ibm_en_pre_defined_template": eventnotification.DataSourceIBMEnPreDefinedTemplate(), + "ibm_en_pre_defined_templates": eventnotification.DataSourceIBMEnPreDefinedTemplates(), + "ibm_en_code_engine_template": eventnotification.DataSourceIBMEnCodeEngineTemplate(), + "ibm_en_destination_app_configuration": eventnotification.DataSourceIBMEnAppConfigurationDestination(), + "ibm_en_subscription_app_configuration": eventnotification.DataSourceIBMEnAppConfigurationSubscription(), + "ibm_en_app_configuration_template": eventnotification.DataSourceIBMEnAppConfigurationTemplate(), // Added for Toolchain "ibm_cd_toolchain": cdtoolchain.DataSourceIBMCdToolchain(), @@ -1646,55 +1649,58 @@ func Provider() *schema.Provider { "ibm_cbr_rule": contextbasedrestrictions.ResourceIBMCbrRule(), // Added for Event Notifications - "ibm_en_source": eventnotification.ResourceIBMEnSource(), - "ibm_en_topic": eventnotification.ResourceIBMEnTopic(), - "ibm_en_destination_webhook": eventnotification.ResourceIBMEnWebhookDestination(), - "ibm_en_destination_android": eventnotification.ResourceIBMEnFCMDestination(), - "ibm_en_destination_chrome": eventnotification.ResourceIBMEnChromeDestination(), - "ibm_en_destination_firefox": eventnotification.ResourceIBMEnFirefoxDestination(), - "ibm_en_destination_ios": eventnotification.ResourceIBMEnAPNSDestination(), - "ibm_en_destination_slack": eventnotification.ResourceIBMEnSlackDestination(), - "ibm_en_subscription_sms": eventnotification.ResourceIBMEnSMSSubscription(), - "ibm_en_subscription_email": eventnotification.ResourceIBMEnEmailSubscription(), - "ibm_en_subscription_webhook": eventnotification.ResourceIBMEnWebhookSubscription(), - "ibm_en_subscription_android": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_subscription_ios": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_subscription_chrome": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_subscription_firefox": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_subscription_slack": eventnotification.ResourceIBMEnSlackSubscription(), - "ibm_en_subscription_safari": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_destination_safari": eventnotification.ResourceIBMEnSafariDestination(), - "ibm_en_destination_msteams": eventnotification.ResourceIBMEnMSTeamsDestination(), - "ibm_en_subscription_msteams": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_destination_pagerduty": eventnotification.ResourceIBMEnPagerDutyDestination(), - "ibm_en_subscription_pagerduty": eventnotification.ResourceIBMEnPagerDutySubscription(), - "ibm_en_integration": eventnotification.ResourceIBMEnIntegration(), - "ibm_en_destination_sn": eventnotification.ResourceIBMEnServiceNowDestination(), - "ibm_en_subscription_sn": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_destination_ce": eventnotification.ResourceIBMEnCodeEngineDestination(), - "ibm_en_subscription_ce": eventnotification.ResourceIBMEnCodeEngineSubscription(), - "ibm_en_destination_cos": eventnotification.ResourceIBMEnCOSDestination(), - "ibm_en_subscription_cos": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_destination_huawei": eventnotification.ResourceIBMEnHuaweiDestination(), - "ibm_en_subscription_huawei": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_ibmsource": eventnotification.ResourceIBMEnIBMSource(), - "ibm_en_destination_custom_email": eventnotification.ResourceIBMEnCustomEmailDestination(), - "ibm_en_subscription_custom_email": eventnotification.ResourceIBMEnCustomEmailSubscription(), - "ibm_en_email_template": eventnotification.ResourceIBMEnEmailTemplate(), - "ibm_en_integration_cos": eventnotification.ResourceIBMEnCOSIntegration(), - "ibm_en_destination_custom_sms": eventnotification.ResourceIBMEnCustomSMSDestination(), - "ibm_en_subscription_custom_sms": eventnotification.ResourceIBMEnCustomSMSSubscription(), - "ibm_en_smtp_configuration": eventnotification.ResourceIBMEnSMTPConfiguration(), - "ibm_en_smtp_user": eventnotification.ResourceIBMEnSMTPUser(), - "ibm_en_slack_template": eventnotification.ResourceIBMEnSlackTemplate(), - "ibm_en_smtp_setting": eventnotification.ResourceIBMEnSMTPSetting(), - "ibm_en_webhook_template": eventnotification.ResourceIBMEnWebhookTemplate(), - "ibm_en_subscription_scheduler": eventnotification.ResourceIBMEnFCMSubscription(), - "ibm_en_pagerduty_template": eventnotification.ResourceIBMEnPagerDutyTemplate(), - "ibm_en_destination_event_streams": eventnotification.ResourceIBMEnEventStreamsDestination(), - "ibm_en_subscription_event_streams": eventnotification.ResourceIBMEnEventStreamsSubscription(), - "ibm_en_event_streams_template": eventnotification.ResourceIBMEnEventStreamsTemplate(), - "ibm_en_code_engine_template": eventnotification.ResourceIBMEnCodeEngineTemplate(), + "ibm_en_source": eventnotification.ResourceIBMEnSource(), + "ibm_en_topic": eventnotification.ResourceIBMEnTopic(), + "ibm_en_destination_webhook": eventnotification.ResourceIBMEnWebhookDestination(), + "ibm_en_destination_android": eventnotification.ResourceIBMEnFCMDestination(), + "ibm_en_destination_chrome": eventnotification.ResourceIBMEnChromeDestination(), + "ibm_en_destination_firefox": eventnotification.ResourceIBMEnFirefoxDestination(), + "ibm_en_destination_ios": eventnotification.ResourceIBMEnAPNSDestination(), + "ibm_en_destination_slack": eventnotification.ResourceIBMEnSlackDestination(), + "ibm_en_subscription_sms": eventnotification.ResourceIBMEnSMSSubscription(), + "ibm_en_subscription_email": eventnotification.ResourceIBMEnEmailSubscription(), + "ibm_en_subscription_webhook": eventnotification.ResourceIBMEnWebhookSubscription(), + "ibm_en_subscription_android": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_subscription_ios": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_subscription_chrome": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_subscription_firefox": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_subscription_slack": eventnotification.ResourceIBMEnSlackSubscription(), + "ibm_en_subscription_safari": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_destination_safari": eventnotification.ResourceIBMEnSafariDestination(), + "ibm_en_destination_msteams": eventnotification.ResourceIBMEnMSTeamsDestination(), + "ibm_en_subscription_msteams": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_destination_pagerduty": eventnotification.ResourceIBMEnPagerDutyDestination(), + "ibm_en_subscription_pagerduty": eventnotification.ResourceIBMEnPagerDutySubscription(), + "ibm_en_integration": eventnotification.ResourceIBMEnIntegration(), + "ibm_en_destination_sn": eventnotification.ResourceIBMEnServiceNowDestination(), + "ibm_en_subscription_sn": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_destination_ce": eventnotification.ResourceIBMEnCodeEngineDestination(), + "ibm_en_subscription_ce": eventnotification.ResourceIBMEnCodeEngineSubscription(), + "ibm_en_destination_cos": eventnotification.ResourceIBMEnCOSDestination(), + "ibm_en_subscription_cos": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_destination_huawei": eventnotification.ResourceIBMEnHuaweiDestination(), + "ibm_en_subscription_huawei": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_ibmsource": eventnotification.ResourceIBMEnIBMSource(), + "ibm_en_destination_custom_email": eventnotification.ResourceIBMEnCustomEmailDestination(), + "ibm_en_subscription_custom_email": eventnotification.ResourceIBMEnCustomEmailSubscription(), + "ibm_en_email_template": eventnotification.ResourceIBMEnEmailTemplate(), + "ibm_en_integration_cos": eventnotification.ResourceIBMEnCOSIntegration(), + "ibm_en_destination_custom_sms": eventnotification.ResourceIBMEnCustomSMSDestination(), + "ibm_en_subscription_custom_sms": eventnotification.ResourceIBMEnCustomSMSSubscription(), + "ibm_en_smtp_configuration": eventnotification.ResourceIBMEnSMTPConfiguration(), + "ibm_en_smtp_user": eventnotification.ResourceIBMEnSMTPUser(), + "ibm_en_slack_template": eventnotification.ResourceIBMEnSlackTemplate(), + "ibm_en_smtp_setting": eventnotification.ResourceIBMEnSMTPSetting(), + "ibm_en_webhook_template": eventnotification.ResourceIBMEnWebhookTemplate(), + "ibm_en_subscription_scheduler": eventnotification.ResourceIBMEnFCMSubscription(), + "ibm_en_pagerduty_template": eventnotification.ResourceIBMEnPagerDutyTemplate(), + "ibm_en_destination_event_streams": eventnotification.ResourceIBMEnEventStreamsDestination(), + "ibm_en_subscription_event_streams": eventnotification.ResourceIBMEnEventStreamsSubscription(), + "ibm_en_event_streams_template": eventnotification.ResourceIBMEnEventStreamsTemplate(), + "ibm_en_code_engine_template": eventnotification.ResourceIBMEnCodeEngineTemplate(), + "ibm_en_destination_app_configuration": eventnotification.ResourceIBMEnAppConfigurationDestination(), + "ibm_en_subscription_app_configuration": eventnotification.ResourceIBMEnAppConfigurationSubscription(), + "ibm_en_app_configuration_template": eventnotification.ResourceIBMEnAppConfigurationTemplate(), // Added for Toolchain "ibm_cd_toolchain": cdtoolchain.ResourceIBMCdToolchain(), diff --git a/ibm/service/eventnotification/data_source_ibm_en_app_configuration_subscription.go b/ibm/service/eventnotification/data_source_ibm_en_app_configuration_subscription.go new file mode 100644 index 0000000000..ced6e08e26 --- /dev/null +++ b/ibm/service/eventnotification/data_source_ibm_en_app_configuration_subscription.go @@ -0,0 +1,161 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification + +import ( + "context" + "fmt" + "log" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + en "github.com/IBM/event-notifications-go-admin-sdk/eventnotificationsv1" +) + +func DataSourceIBMEnAppConfigurationSubscription() *schema.Resource { + return &schema.Resource{ + ReadContext: dataSourceIBMEnEventStreamsSubscriptionRead, + + Schema: map[string]*schema.Schema{ + "instance_guid": { + Type: schema.TypeString, + Required: true, + Description: "Unique identifier for IBM Cloud Event Notifications instance.", + }, + "subscription_id": { + Type: schema.TypeString, + Required: true, + Description: "Unique identifier for result.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Subscription name.", + }, + "description": { + Type: schema.TypeString, + Computed: true, + Description: "Subscription description.", + }, + "destination_id": { + Type: schema.TypeString, + Computed: true, + Description: "The destination ID.", + }, + "topic_id": { + Type: schema.TypeString, + Computed: true, + Description: "Topic ID.", + }, + "attributes": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "template_id_notification": { + Type: schema.TypeString, + Computed: true, + Description: "The templete id for notification", + }, + "feature_flag_enabled": { + Type: schema.TypeBool, + Computed: true, + Description: "App Configuration enable feature flag attribute", + }, + }, + }, + }, + "updated_at": { + Type: schema.TypeString, + Computed: true, + Description: "Last updated time.", + }, + }, + } +} + +func dataSourceIBMEnAppConfigurationSubscriptionRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "(Data) ibm_en_subscription_event_streams", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + getSubscriptionOptions := &en.GetSubscriptionOptions{} + + getSubscriptionOptions.SetInstanceID(d.Get("instance_guid").(string)) + getSubscriptionOptions.SetID(d.Get("subscription_id").(string)) + + result, _, err := enClient.GetSubscriptionWithContext(context, getSubscriptionOptions) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetIntegrationWithContext failed: %s", err.Error()), "(Data) ibm_en_subscription_event_streams", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + d.SetId(fmt.Sprintf("%s/%s", *getSubscriptionOptions.InstanceID, *getSubscriptionOptions.ID)) + + if err = d.Set("name", result.Name); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_en_subscription_event_streams", "read") + return tfErr.GetDiag() + } + + if result.Description != nil { + if err = d.Set("description", result.Description); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting description: %s", err), "(Data) ibm_en_subscription_event_streams", "read") + return tfErr.GetDiag() + } + } + if err = d.Set("updated_at", result.UpdatedAt); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting updated_at: %s", err), "(Data) ibm_en_subscription_event_streams", "read") + return tfErr.GetDiag() + } + + if err = d.Set("destination_id", result.DestinationID); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting destination_id: %s", err), "(Data) ibm_en_subscription_event_streams", "read") + return tfErr.GetDiag() + } + + if err = d.Set("topic_id", result.TopicID); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting topic_id: %s", err), "(Data) ibm_en_subscription_event_streams", "read") + return tfErr.GetDiag() + } + + if result.Attributes != nil { + if err = d.Set("attributes", enAppConfigurationSubscriptionFlattenAttributes(result.Attributes)); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting attributes: %s", err), "(Data) ibm_en_subscription_event_streams", "read") + return tfErr.GetDiag() + } + } + + return nil +} + +func enAppConfigurationSubscriptionFlattenAttributes(result en.SubscriptionAttributesIntf) (finalList []map[string]interface{}) { + finalList = []map[string]interface{}{} + + attributes := result.(*en.SubscriptionAttributes) + + finalMap := enEventStreamsSubscriptionToMap(attributes) + finalList = append(finalList, finalMap) + + return finalList +} + +func enAppConfigurationSubscriptionToMap(attributeItem *en.SubscriptionAttributes) (attributeMap map[string]interface{}) { + attributeMap = map[string]interface{}{} + + if attributeItem.TemplateIDNotification != nil { + attributeMap["template_id_notification"] = attributeItem.TemplateIDNotification + } + if attributeItem.FeatureFlagEnabled != nil { + attributeMap["feature_flag_enabled"] = attributeItem.FeatureFlagEnabled + } + + return attributeMap +} diff --git a/ibm/service/eventnotification/data_source_ibm_en_app_configuration_subscription_test.go b/ibm/service/eventnotification/data_source_ibm_en_app_configuration_subscription_test.go new file mode 100644 index 0000000000..cfa612186b --- /dev/null +++ b/ibm/service/eventnotification/data_source_ibm_en_app_configuration_subscription_test.go @@ -0,0 +1,91 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification_test + +import ( + "fmt" + "testing" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func TestAccIBMEnAppConfigurationSubscriptionDataSourceAllArgs(t *testing.T) { + instanceName := fmt.Sprintf("tf_instance_%d", acctest.RandIntRange(10, 100)) + name := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + description := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMEnAppConfigurationSubscriptionDataSourceConfig(instanceName, name, description), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "id"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "instance_guid"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "subscription_id"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "name"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "description"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "updated_at"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "destination_type"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "destination_id"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "destination_name"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "topic_id"), + resource.TestCheckResourceAttrSet("data.ibm_en_subscription_app_configuration.data_subscription_1", "topic_name"), + ), + }, + }, + }) +} + +func testAccCheckIBMEnAppConfigurationSubscriptionDataSourceConfig(instanceName, name, description string) string { + return fmt.Sprintf(` + resource "ibm_resource_instance" "en_subscription_datasource" { + name = "%s" + location = "us-south" + plan = "standard" + service = "event-notifications" + } + + resource "ibm_en_topic" "en_topic_resource_4" { + instance_guid = ibm_resource_instance.en_subscription_datasource.guid + name = "tf_topic_name_0664" + description = "tf_topic_description_0455" + } + + resource "ibm_en_destination_app_configuration" "en_destination_resource_2" { + instance_guid = ibm_resource_instance.en_subscription_resource.guid + name = "event_streams_destination" + type = "event_streams" + description = "event streams destination tf" + config { + params { + type = "features" + crn = "crn:v1:staging:public:apprapp:us-south:a/9f007405a9fe4a5d9345fa8c131610c8:3a86a8e4-fe8b-4e43-9727-2f2cf987f1c8::" + feature_id = "cross" + environment_id = "dev" + } + } + } + resource "ibm_en_subscription_app_configuration" "en_subscription_resource_1" { + name = "%s" + description = "%s" + instance_guid = ibm_resource_instance.en_subscription_resource.guid + topic_id = ibm_en_topic.en_topic_resource_2.topic_id + destination_id = ibm_en_destination_app_configuration.en_destination_resource_2.destination_id + attributes { + feature_flag_enabled = true + } + } + + data "ibm_en_subscription_app_configuration" "data_subscription_1" { + instance_guid = ibm_resource_instance.en_subscription_datasource.guid + subscription_id = ibm_en_subscription_app_configuration.en_subscription_resource_4.subscription_id + } + + `, instanceName, name, description) +} diff --git a/ibm/service/eventnotification/data_source_ibm_en_app_configuration_template.go b/ibm/service/eventnotification/data_source_ibm_en_app_configuration_template.go new file mode 100644 index 0000000000..36072af4b7 --- /dev/null +++ b/ibm/service/eventnotification/data_source_ibm_en_app_configuration_template.go @@ -0,0 +1,128 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification + +import ( + "context" + "fmt" + "log" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + en "github.com/IBM/event-notifications-go-admin-sdk/eventnotificationsv1" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" +) + +func DataSourceIBMEnAppConfigurationTemplate() *schema.Resource { + return &schema.Resource{ + ReadContext: dataSourceIBMEnAppConfigurationTemplateRead, + + Schema: map[string]*schema.Schema{ + "instance_guid": { + Type: schema.TypeString, + Required: true, + Description: "Unique identifier for IBM Cloud Event Notifications instance.", + }, + "template_id": { + Type: schema.TypeString, + Required: true, + Description: "Unique identifier for Template.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Template name.", + }, + "description": { + Type: schema.TypeString, + Computed: true, + Description: "Template description.", + }, + "type": { + Type: schema.TypeString, + Computed: true, + Description: "Template type event_streams.notification.", + }, + "updated_at": { + Type: schema.TypeString, + Computed: true, + Description: "Last updated time.", + }, + "subscription_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Number of subscriptions.", + }, + "subscription_names": { + Type: schema.TypeList, + Computed: true, + Description: "List of subscriptions.", + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + }, + } +} + +func dataSourceIBMEnAppConfigurationTemplateRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "(Data) ibm_en_app_configuration_template", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.GetTemplateOptions{} + + options.SetInstanceID(d.Get("instance_guid").(string)) + options.SetID(d.Get("template_id").(string)) + + result, _, err := enClient.GetTemplateWithContext(context, options) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetTemplateWithContext failed: %s", err.Error()), "(Data) ibm_en_app_configuration_template", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + d.SetId(fmt.Sprintf("%s/%s", *options.InstanceID, *options.ID)) + + if err = d.Set("name", result.Name); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_en_app_configuration_template", "read") + return tfErr.GetDiag() + } + + if result.Description != nil { + if err = d.Set("description", result.Description); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting description: %s", err), "(Data) ibm_en_app_configuration_template", "read") + return tfErr.GetDiag() + } + } + + if err = d.Set("type", result.Type); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting type: %s", err), "(Data) ibm_en_app_configuration_template", "read") + return tfErr.GetDiag() + } + + if result.SubscriptionNames != nil { + err = d.Set("subscription_names", result.SubscriptionNames) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting subscription_names: %s", err), "(Data) ibm_en_app_configuration_template", "read") + return tfErr.GetDiag() + } + } + + if err = d.Set("updated_at", flex.DateTimeToString(result.UpdatedAt)); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting updated_at: %s", err), "(Data) ibm_en_app_configuration_template", "read") + return tfErr.GetDiag() + } + + if err = d.Set("subscription_count", flex.IntValue(result.SubscriptionCount)); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting subscription_count: %s", err), "(Data) ibm_en_app_configuration_template", "read") + return tfErr.GetDiag() + } + + return nil +} diff --git a/ibm/service/eventnotification/data_source_ibm_en_app_configuration_template_test.go b/ibm/service/eventnotification/data_source_ibm_en_app_configuration_template_test.go new file mode 100644 index 0000000000..4a6917923e --- /dev/null +++ b/ibm/service/eventnotification/data_source_ibm_en_app_configuration_template_test.go @@ -0,0 +1,103 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification_test + +import ( + "fmt" + "testing" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func TestAccIBMEnAppConfigurationTemplateDataSourceBasic(t *testing.T) { + templateInstanceID := fmt.Sprintf("tf_instance_id_%d", acctest.RandIntRange(10, 100)) + templateName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + templateType := fmt.Sprintf("tf_type_%d", acctest.RandIntRange(10, 100)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccCheckIBMEnAppConfigurationTemplateDataSourceConfigBasic(templateInstanceID, templateName, templateType), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "id"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "instance_id"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "template_id"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "name"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "description"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "type"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "subscription_count"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "subscription_names.#"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "updated_at"), + ), + }, + }, + }) +} + +func TestAccIBMEnAppConfigurationTemplateDataSourceAllArgs(t *testing.T) { + templateInstanceID := fmt.Sprintf("tf_instance_id_%d", acctest.RandIntRange(10, 100)) + templateName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + templateDescription := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) + templateType := fmt.Sprintf("tf_type_%d", acctest.RandIntRange(10, 100)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccCheckIBMEnAppConfigurationTemplateDataSourceConfig(templateInstanceID, templateName, templateDescription, templateType), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "id"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "instance_id"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "template_id"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "name"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "description"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "type"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "subscription_count"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "subscription_names.#"), + resource.TestCheckResourceAttrSet("data.ibm_en_app_configuration_template.en_template_instance", "updated_at"), + ), + }, + }, + }) +} + +func testAccCheckIBMEnAppConfigurationTemplateDataSourceConfigBasic(templateInstanceID string, templateName string, templateType string) string { + return fmt.Sprintf(` + resource "ibm_en_app_configuration_template" "en_template_instance" { + instance_id = "%s" + name = "%s" + type = "%s" + } + + data "ibm_en_app_configuration_template" "en_template_instance" { + instance_id = ibm_en_app_configuration_template.en_template_instance.instance_id + template_id = ibm_en_app_configuration_template.en_template_instance.template_id + } + `, templateInstanceID, templateName, templateType) +} + +func testAccCheckIBMEnAppConfigurationTemplateDataSourceConfig(templateInstanceID string, templateName string, templateDescription string, templateType string) string { + return fmt.Sprintf(` + resource "ibm_en_app_configuration_template" "en_template_instance" { + instance_id = "%s" + name = "%s" + description = "%s" + type = "%s" + params { + body = "eyJlbmFibGVkIjogdHJ1ZX0=" + } + } + + data "ibm_en_app_configuration_template" "en_template_instance" { + instance_id = ibm_en_app_configuration_template.en_template_instance.instance_id + en_template_id = ibm_en_app_configuration_template.en_template_instance.template_id + } + `, templateInstanceID, templateName, templateDescription, templateType) +} diff --git a/ibm/service/eventnotification/data_source_ibm_en_destination_app_configuration.go b/ibm/service/eventnotification/data_source_ibm_en_destination_app_configuration.go new file mode 100644 index 0000000000..1965a0effe --- /dev/null +++ b/ibm/service/eventnotification/data_source_ibm_en_destination_app_configuration.go @@ -0,0 +1,229 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification + +import ( + "context" + "fmt" + "log" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + en "github.com/IBM/event-notifications-go-admin-sdk/eventnotificationsv1" +) + +func DataSourceIBMEnAppConfigurationDestination() *schema.Resource { + return &schema.Resource{ + ReadContext: dataSourceIBMEnEventStreamsDestinationRead, + + Schema: map[string]*schema.Schema{ + "instance_guid": { + Type: schema.TypeString, + Required: true, + Description: "Unique identifier for IBM Cloud Event Notifications instance.", + }, + "destination_id": { + Type: schema.TypeString, + Required: true, + Description: "Unique identifier for Destination.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Destination name.", + }, + "description": { + Type: schema.TypeString, + Computed: true, + Description: "Destination description.", + }, + "type": { + Type: schema.TypeString, + Computed: true, + Description: "Destination type app_configuration.", + }, + "collect_failed_events": { + Type: schema.TypeBool, + Computed: true, + Description: "Whether to collect the failed event in Cloud Object Storage bucket", + }, + "config": { + Type: schema.TypeList, + Computed: true, + Description: "Payload describing a destination configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "params": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "type": { + Type: schema.TypeString, + Computed: true, + Description: "The App Configuration Destination type", + }, + "crn": { + Type: schema.TypeString, + Computed: true, + Description: "CRN of the App Configuration instance", + }, + "feature_id": { + Type: schema.TypeString, + Computed: true, + Description: "Feature ID of App Configuration", + }, + "environment_id": { + Type: schema.TypeString, + Computed: true, + Description: "Environment ID of App Configuration", + }, + }, + }, + }, + }, + }, + }, + "updated_at": { + Type: schema.TypeString, + Computed: true, + Description: "Last updated time.", + }, + "subscription_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Number of subscriptions.", + }, + "subscription_names": { + Type: schema.TypeList, + Computed: true, + Description: "List of subscriptions.", + Elem: &schema.Schema{ + Type: schema.TypeString, + }, + }, + }, + } +} + +func dataSourceIBMEnAppConfigurationDestinationRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "(Data) ibm_en_destination_app_configuration", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.GetDestinationOptions{} + + options.SetInstanceID(d.Get("instance_guid").(string)) + options.SetID(d.Get("destination_id").(string)) + + result, _, err := enClient.GetDestinationWithContext(context, options) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetDestinationWithContext failed: %s", err.Error()), "(Data) ibm_en_destination_app_configuration", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + d.SetId(fmt.Sprintf("%s/%s", *options.InstanceID, *options.ID)) + + if err = d.Set("name", result.Name); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_en_destination_app_configuration", "read") + return tfErr.GetDiag() + } + + if result.Description != nil { + if err = d.Set("description", result.Description); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting description: %s", err), "(Data) ibm_en_destination_app_configuration", "read") + return tfErr.GetDiag() + } + } + + if err = d.Set("type", result.Type); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting type: %s", err), "(Data) ibm_en_destination_app_configuration", "read") + return tfErr.GetDiag() + } + + if err = d.Set("collect_failed_events", result.CollectFailedEvents); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting CollectFailedEvents: %s", err), "(Data) ibm_en_destination_app_configuration", "read") + return tfErr.GetDiag() + } + + if result.Config != nil { + err = d.Set("config", enAppConfigurationDestinationFlattenConfig(*result.Config)) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting config: %s", err), "(Data) ibm_en_destination_app_configuration", "read") + return tfErr.GetDiag() + } + } + + if result.SubscriptionNames != nil { + err = d.Set("subscription_names", result.SubscriptionNames) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting subscription_names: %s", err), "(Data) ibm_en_destination_app_configuration", "read") + return tfErr.GetDiag() + } + } + + if err = d.Set("updated_at", flex.DateTimeToString(result.UpdatedAt)); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting updated_at: %s", err), "(Data) ibm_en_destination_app_configuration", "read") + return tfErr.GetDiag() + } + + if err = d.Set("subscription_count", flex.IntValue(result.SubscriptionCount)); err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Error setting subscription_count: %s", err), "(Data) ibm_en_destination_app_configuration", "read") + return tfErr.GetDiag() + } + + return nil +} + +func enAppConfigurationDestinationFlattenConfig(result en.DestinationConfig) (finalList []map[string]interface{}) { + finalList = []map[string]interface{}{} + finalMap := enAppConfigurationDestinationConfigToMap(result) + finalList = append(finalList, finalMap) + + return finalList +} + +func enAppConfigurationDestinationConfigToMap(configItem en.DestinationConfig) (configMap map[string]interface{}) { + configMap = map[string]interface{}{} + + if configItem.Params != nil { + paramsList := []map[string]interface{}{} + paramsMap := enAppConfigurationDestinationConfigParamsToMap(configItem.Params) + paramsList = append(paramsList, paramsMap) + configMap["params"] = paramsList + } + + return configMap +} + +func enAppConfigurationDestinationConfigParamsToMap(paramsItem en.DestinationConfigOneOfIntf) (paramsMap map[string]interface{}) { + paramsMap = map[string]interface{}{} + + params := paramsItem.(*en.DestinationConfigOneOf) + + if params.Type != nil { + paramsMap["type"] = params.Type + } + + if params.CRN != nil { + paramsMap["crn"] = params.CRN + } + + if params.FeatureID != nil { + paramsMap["feature_id"] = params.FeatureID + } + + if params.EnvironmentID != nil { + paramsMap["environment_id"] = params.EnvironmentID + } + + return paramsMap +} diff --git a/ibm/service/eventnotification/data_source_ibm_en_destination_app_configuration_test.go b/ibm/service/eventnotification/data_source_ibm_en_destination_app_configuration_test.go new file mode 100644 index 0000000000..a030070fd9 --- /dev/null +++ b/ibm/service/eventnotification/data_source_ibm_en_destination_app_configuration_test.go @@ -0,0 +1,70 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification_test + +import ( + "fmt" + "testing" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" +) + +func TestAccIBMEnAppConfigurationDestinationDataSourceBasic(t *testing.T) { + name := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + instanceName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + description := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMEnAppConfigurationDestinationDataSourceConfigBasic(instanceName, name, description), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("data.ibm_en_destination_app_configuration.en_destination_data_6", "id"), + resource.TestCheckResourceAttrSet("data.ibm_en_destination_app_configuration.en_destination_data_6", "instance_guid"), + resource.TestCheckResourceAttrSet("data.ibm_en_destination_app_configuration.en_destination_data_6", "name"), + resource.TestCheckResourceAttrSet("data.ibm_en_destination_app_configuration.en_destination_data_6", "description"), + resource.TestCheckResourceAttrSet("data.ibm_en_destination_app_configuration.en_destination_data_6", "type"), + resource.TestCheckResourceAttrSet("data.ibm_en_destination_app_configuration.en_destination_data_6", "updated_at"), + resource.TestCheckResourceAttrSet("data.ibm_en_destination_app_configuration.en_destination_data_6", "destination_id"), + resource.TestCheckResourceAttrSet("data.ibm_en_destination_app_configuration.en_destination_data_6", "subscription_count"), + ), + }, + }, + }) +} + +func testAccCheckIBMEnAppConfigurationDestinationDataSourceConfigBasic(instanceName, name, description string) string { + return fmt.Sprintf(` + resource "ibm_resource_instance" "en_destination_datasource2" { + name = "%s" + location = "us-south" + plan = "standard" + service = "event-notifications" + } + + resource "ibm_en_destination_app_configuration" "en_destination_datasource_4" { + instance_guid = ibm_resource_instance.en_destination_resource.guid + name = "%s" + type = "event_streams" + description = "%s" + config { + params { + type = "features" + crn = "crn:v1:staging:public:apprapp:us-south:a/9f007405a9fe4a5d9345fa8c131610c8:3a86a8e4-fe8b-4e43-9727-2f2cf987f1c8::" + feature_id = "cross" + environment_id = "dev" + } + } + } + + data "ibm_en_destination_app_configuration" "en_destination_data_6" { + instance_guid = ibm_resource_instance.en_destination_datasource2.guid + destination_id = ibm_en_destination_app_configuration.en_destination_datasource_4.destination_id + } + `, instanceName, name, description) +} diff --git a/ibm/service/eventnotification/resource_ibm_en_app_configuration_template.go b/ibm/service/eventnotification/resource_ibm_en_app_configuration_template.go new file mode 100644 index 0000000000..659305558b --- /dev/null +++ b/ibm/service/eventnotification/resource_ibm_en_app_configuration_template.go @@ -0,0 +1,276 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification + +import ( + "context" + "fmt" + "log" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + en "github.com/IBM/event-notifications-go-admin-sdk/eventnotificationsv1" + "github.com/IBM/go-sdk-core/v5/core" +) + +func ResourceIBMEnAppConfigurationTemplate() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceIBMEnAppConfigurationTemplateCreate, + ReadContext: resourceIBMEnAppConfigurationTemplateRead, + UpdateContext: resourceIBMEnAppConfigurationTemplateUpdate, + DeleteContext: resourceIBMEnAppConfigurationTemplateDelete, + Importer: &schema.ResourceImporter{}, + + Schema: map[string]*schema.Schema{ + "instance_guid": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Unique identifier for IBM Cloud Event Notifications instance.", + }, + "name": { + Type: schema.TypeString, + Required: true, + Description: "Subscription name.", + }, + "description": { + Type: schema.TypeString, + Optional: true, + Description: "Subscription description.", + }, + "type": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "The type of template", + }, + "params": { + Type: schema.TypeList, + MaxItems: 1, + Required: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "body": { + Type: schema.TypeString, + Required: true, + Description: "The base64 AppConfiguration Template body.", + }, + }, + }, + }, + "template_id": { + Type: schema.TypeString, + Computed: true, + Description: "Subscription ID.", + }, + "subscription_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Number of subscriptions.", + }, + "updated_at": { + Type: schema.TypeString, + Computed: true, + Description: "Last updated time.", + }, + "subscription_names": { + Type: schema.TypeList, + Computed: true, + Description: "List of subscriptions.", + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + } +} + +func resourceIBMEnAppConfigurationTemplateCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_app_configuration_template", "create") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.CreateTemplateOptions{} + + options.SetInstanceID(d.Get("instance_guid").(string)) + + options.SetName(d.Get("name").(string)) + options.SetType(d.Get("type").(string)) + + if _, ok := d.GetOk("description"); ok { + options.SetDescription(d.Get("description").(string)) + } + + params := SlackTemplateParamsMap(d.Get("params.0").(map[string]interface{})) + options.SetParams(¶ms) + + result, _, err := enClient.CreateTemplateWithContext(context, options) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("CreateTemplateWithContext failed: %s", err.Error()), "ibm_en_app_configuration_template", "create") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + d.SetId(fmt.Sprintf("%s/%s", *options.InstanceID, *result.ID)) + + return resourceIBMEnAppConfigurationTemplateRead(context, d, meta) +} + +func resourceIBMEnAppConfigurationTemplateRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_app_configuration_template", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.GetTemplateOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_app_configuration_template", "update") + return tfErr.GetDiag() + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + result, response, err := enClient.GetTemplateWithContext(context, options) + if err != nil { + if response != nil && response.StatusCode == 404 { + d.SetId("") + return nil + } + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetTemplateWithContext failed: %s", err.Error()), "ibm_en_app_configuration_template", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + if err = d.Set("instance_guid", options.InstanceID); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting instance_guid: %s", err)) + } + + if err = d.Set("template_id", options.ID); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting template_id: %s", err)) + } + + if err = d.Set("name", result.Name); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting name: %s", err)) + } + + if result.Description != nil { + if err = d.Set("description", result.Description); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting description: %s", err)) + } + } + + if err = d.Set("type", result.Type); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting template type: %s", err)) + } + + if err = d.Set("subscription_count", flex.IntValue(result.SubscriptionCount)); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting subscription_count: %s", err)) + } + + if err = d.Set("subscription_names", result.SubscriptionNames); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting subscription_names: %s", err)) + } + + if err = d.Set("updated_at", flex.DateTimeToString(result.UpdatedAt)); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting updated_at: %s", err)) + } + return nil +} + +func resourceIBMEnAppConfigurationTemplateUpdate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_app_configuration_template", "update") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.ReplaceTemplateOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_app_configuration_template", "update") + return tfErr.GetDiag() + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + options.SetType(d.Get("type").(string)) + + if ok := d.HasChanges("name", "description", "params"); ok { + options.SetName(d.Get("name").(string)) + + if _, ok := d.GetOk("description"); ok { + options.SetDescription(d.Get("description").(string)) + } + + params := SlackTemplateParamsMap(d.Get("params.0").(map[string]interface{})) + options.SetParams(¶ms) + + _, _, err := enClient.ReplaceTemplateWithContext(context, options) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("ReplaceTemplateWithContext failed: %s", err.Error()), "ibm_en_app_configuration_template", "update") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + return resourceIBMEnPagerDutyTemplateRead(context, d, meta) + } + + return nil +} + +func resourceIBMEnAppConfigurationTemplateDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_app_configuration_template", "delete") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.DeleteTemplateOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_app_configuration_template", "delete") + return tfErr.GetDiag() + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + response, err := enClient.DeleteTemplateWithContext(context, options) + if err != nil { + if response != nil && response.StatusCode == 404 { + d.SetId("") + return nil + } + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("DeleteTemplateWithContext: failed: %s", err.Error()), "ibm_en_app_configuration_template", "delete") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + d.SetId("") + + return nil +} + +func AppConfigurationTemplateParamsMap(configParams map[string]interface{}) en.TemplateConfigOneOf { + params := new(en.TemplateConfigOneOf) + if configParams["body"] != nil { + params.Body = core.StringPtr(configParams["body"].(string)) + } + + return *params +} diff --git a/ibm/service/eventnotification/resource_ibm_en_app_configuration_template_test.go b/ibm/service/eventnotification/resource_ibm_en_app_configuration_template_test.go new file mode 100644 index 0000000000..1e7329be71 --- /dev/null +++ b/ibm/service/eventnotification/resource_ibm_en_app_configuration_template_test.go @@ -0,0 +1,145 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification_test + +import ( + "fmt" + "testing" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + + en "github.com/IBM/event-notifications-go-admin-sdk/eventnotificationsv1" +) + +func TestAccIBMEnAppConfigurationTemplateAllArgs(t *testing.T) { + var params en.Template + name := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + instanceName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + description := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) + newName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + newDescription := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIBMEnEmailTemplateDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMEnAppConfigurationTemplateConfig(instanceName, name, description), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMEnAppConfigurationTemplateExists("ibm_en_app_configuration_template.en_template_resource_1", params), + resource.TestCheckResourceAttr("ibm_en_app_configuration_template.en_template_resource_1", "name", name), + resource.TestCheckResourceAttr("ibm_en_app_configuration_template.en_template_resource_1", "type", "app_configuration.notification"), + resource.TestCheckResourceAttr("ibm_en_app_configuration_template.en_template_resource_1", "description", description), + ), + }, + { + Config: testAccCheckIBMEnAppConfigurationTemplateConfig(instanceName, newName, newDescription), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("ibm_en_app_configuration_template.en_template_resource_1", "name", newName), + resource.TestCheckResourceAttr("ibm_en_app_configuration_template.en_template_resource_1", "type", "app_configuration.notification"), + resource.TestCheckResourceAttr("ibm_en_app_configuration_template.en_template_resource_1", "description", newDescription), + ), + }, + { + ResourceName: "ibm_en_app_configuration_template.en_template_resource_1", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccCheckIBMEnAppConfigurationTemplateConfig(instanceName, name, description string) string { + return fmt.Sprintf(` + resource "ibm_resource_instance" "en_template_resource" { + name = "%s" + location = "us-south" + plan = "standard" + service = "event-notifications" + } + + resource "ibm_en_app_configuration_template" "en_template_resource_1" { + instance_guid = ibm_resource_instance.en_template_resource.guid + name = "%s" + type = "app_configuration.notification" + description = "%s" + params { + body = "eyJlbmFibGVkIjogdHJ1ZX0=" + } + } + `, instanceName, name, description) +} + +func testAccCheckIBMEnAppConfigurationTemplateExists(n string, obj en.Template) resource.TestCheckFunc { + + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + enClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + return err + } + + options := &en.GetTemplateOptions{} + + parts, err := flex.SepIdParts(rs.Primary.ID, "/") + if err != nil { + return err + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + result, _, err := enClient.GetTemplate(options) + if err != nil { + return err + } + + obj = *result + return nil + } +} + +func testAccCheckIBMEnAppConfigurationTemplateDestroy(s *terraform.State) error { + enClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + return err + } + for _, rs := range s.RootModule().Resources { + if rs.Type != "en_template_resource_1" { + continue + } + + options := &en.GetTemplateOptions{} + + parts, err := flex.SepIdParts(rs.Primary.ID, "/") + if err != nil { + return err + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + // Try to find the key + _, response, err := enClient.GetTemplate(options) + + if err == nil { + return fmt.Errorf("en_template_resource still exists: %s", rs.Primary.ID) + } else if response.StatusCode != 404 { + return fmt.Errorf("[ERROR] Error checking for en_template_resource_1 (%s) has been destroyed: %s", rs.Primary.ID, err) + } + } + + return nil +} diff --git a/ibm/service/eventnotification/resource_ibm_en_destination_app_configuration.go b/ibm/service/eventnotification/resource_ibm_en_destination_app_configuration.go new file mode 100644 index 0000000000..f991bcd0cc --- /dev/null +++ b/ibm/service/eventnotification/resource_ibm_en_destination_app_configuration.go @@ -0,0 +1,335 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification + +import ( + "context" + "fmt" + "log" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/IBM/go-sdk-core/v5/core" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + en "github.com/IBM/event-notifications-go-admin-sdk/eventnotificationsv1" +) + +func ResourceIBMEnAppConfigurationDestination() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceIBMEnAppConfigurationDestinationCreate, + ReadContext: resourceIBMEnAppConfigurationDestinationRead, + UpdateContext: resourceIBMEnAppConfigurationDestinationUpdate, + DeleteContext: resourceIBMEnAppConfigurationDestinationDelete, + Importer: &schema.ResourceImporter{}, + + Schema: map[string]*schema.Schema{ + "instance_guid": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Unique identifier for IBM Cloud Event Notifications instance.", + }, + "name": { + Type: schema.TypeString, + Required: true, + Description: "The Destintion name.", + }, + "type": { + Type: schema.TypeString, + Required: true, + Description: "The type of Destination, supported type is app_configuration.", + }, + "description": { + Type: schema.TypeString, + Optional: true, + Description: "The Destination description.", + }, + "collect_failed_events": { + Type: schema.TypeBool, + Optional: true, + Description: "Whether to collect the failed event in Cloud Object Storage bucket", + }, + "config": { + Type: schema.TypeList, + MaxItems: 1, + Required: true, + Description: "Payload describing a destination configuration.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "params": { + Type: schema.TypeList, + MaxItems: 1, + Required: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "type": { + Type: schema.TypeString, + Required: true, + Description: "The App Configuration Destination type", + }, + "crn": { + Type: schema.TypeString, + Required: true, + Description: "CRN of the App Configuration instance", + }, + "feature_id": { + Type: schema.TypeString, + Required: true, + Description: "Feature ID of App Configuration", + }, + "environment_id": { + Type: schema.TypeString, + Required: true, + Description: "Environment ID of App Configuration", + }, + }, + }, + }, + }, + }, + }, + "destination_id": { + Type: schema.TypeString, + Computed: true, + Description: "Destination ID", + }, + "updated_at": { + Type: schema.TypeString, + Computed: true, + Description: "Last updated time.", + }, + "subscription_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Number of subscriptions.", + }, + "subscription_names": { + Type: schema.TypeList, + Computed: true, + Description: "List of subscriptions.", + Elem: &schema.Schema{Type: schema.TypeString}, + }, + }, + } +} + +func resourceIBMEnAppConfigurationDestinationCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_app_configuration", "create") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.CreateDestinationOptions{} + + options.SetInstanceID(d.Get("instance_guid").(string)) + options.SetName(d.Get("name").(string)) + options.SetType(d.Get("type").(string)) + options.SetCollectFailedEvents(d.Get("collect_failed_events").(bool)) + + destinationtype := d.Get("type").(string) + if _, ok := d.GetOk("description"); ok { + options.SetDescription(d.Get("description").(string)) + } + if _, ok := d.GetOk("config"); ok { + config := AppConfigurationdestinationConfigMapToDestinationConfig(d.Get("config.0.params.0").(map[string]interface{}), destinationtype) + options.SetConfig(&config) + } + + result, _, err := enClient.CreateDestinationWithContext(context, options) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("CreateDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_app_configuration", "create") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + d.SetId(fmt.Sprintf("%s/%s", *options.InstanceID, *result.ID)) + + return resourceIBMEnAppConfigurationDestinationRead(context, d, meta) +} + +func resourceIBMEnAppConfigurationDestinationRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_app_configuration", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.GetDestinationOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_app_configuration", "read") + return tfErr.GetDiag() + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + result, response, err := enClient.GetDestinationWithContext(context, options) + if err != nil { + if response != nil && response.StatusCode == 404 { + d.SetId("") + return nil + } + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_app_configuration", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + if err = d.Set("instance_guid", options.InstanceID); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting instance_guid: %s", err)) + } + + if err = d.Set("destination_id", options.ID); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting destination_id: %s", err)) + } + + if err = d.Set("name", result.Name); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting name: %s", err)) + } + + if err = d.Set("type", result.Type); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting type: %s", err)) + } + + if err = d.Set("collect_failed_events", result.CollectFailedEvents); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting CollectFailedEvents: %s", err)) + } + + if err = d.Set("description", result.Description); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting description: %s", err)) + } + + if result.Config != nil { + err = d.Set("config", enAppConfigurationDestinationFlattenConfig(*result.Config)) + if err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting config %s", err)) + } + } + + if err = d.Set("updated_at", flex.DateTimeToString(result.UpdatedAt)); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting updated_at: %s", err)) + } + + if err = d.Set("subscription_count", flex.IntValue(result.SubscriptionCount)); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting subscription_count: %s", err)) + } + + if err = d.Set("subscription_names", result.SubscriptionNames); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting subscription_names: %s", err)) + + } + + return nil +} + +func resourceIBMEnAppConfigurationDestinationUpdate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_app_configuration", "update") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.UpdateDestinationOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_app_configuration", "update") + return tfErr.GetDiag() + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + if ok := d.HasChanges("name", "description", "collect_failed_events", "config"); ok { + options.SetName(d.Get("name").(string)) + + if _, ok := GetFieldExists(d, "description"); ok { + options.SetDescription(d.Get("description").(string)) + } + + if _, ok := GetFieldExists(d, "collect_failed_events"); ok { + options.SetCollectFailedEvents(d.Get("collect_failed_events").(bool)) + } + destinationtype := d.Get("type").(string) + if _, ok := GetFieldExists(d, "config"); ok { + config := AppConfigurationdestinationConfigMapToDestinationConfig(d.Get("config.0.params.0").(map[string]interface{}), destinationtype) + options.SetConfig(&config) + } + _, _, err := enClient.UpdateDestinationWithContext(context, options) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("UpdateDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_app_configuration", "update") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + return resourceIBMEnAppConfigurationDestinationRead(context, d, meta) + } + + return nil +} + +func resourceIBMEnAppConfigurationDestinationDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_app_configuration", "delete") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.DeleteDestinationOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_app_configuration", "delete") + return tfErr.GetDiag() + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + response, err := enClient.DeleteDestinationWithContext(context, options) + if err != nil { + if response != nil && response.StatusCode == 404 { + d.SetId("") + return nil + } + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("DeleteDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_app_configuration", "delete") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + d.SetId("") + + return nil +} + +func AppConfigurationdestinationConfigMapToDestinationConfig(configParams map[string]interface{}, destinationtype string) en.DestinationConfig { + params := new(en.DestinationConfigOneOf) + if configParams["type"] != nil { + params.Type = core.StringPtr(configParams["type"].(string)) + } + + if configParams["crn"] != nil { + params.CRN = core.StringPtr(configParams["crn"].(string)) + } + + if configParams["environment_id"] != nil { + params.EnvironmentID = core.StringPtr(configParams["environment_id"].(string)) + } + + if configParams["feature_id"] != nil { + params.FeatureID = core.StringPtr(configParams["feature_id"].(string)) + } + + destinationConfig := new(en.DestinationConfig) + destinationConfig.Params = params + return *destinationConfig +} diff --git a/ibm/service/eventnotification/resource_ibm_en_destination_app_configuration_test.go b/ibm/service/eventnotification/resource_ibm_en_destination_app_configuration_test.go new file mode 100644 index 0000000000..afec058456 --- /dev/null +++ b/ibm/service/eventnotification/resource_ibm_en_destination_app_configuration_test.go @@ -0,0 +1,152 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification_test + +import ( + "fmt" + "testing" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + + en "github.com/IBM/event-notifications-go-admin-sdk/eventnotificationsv1" +) + +func TestAccIBMEnAppConfigurationDestinationAllArgs(t *testing.T) { + var config en.Destination + name := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + instanceName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + description := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) + newName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + newDescription := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIBMEnPagerDutyDestinationDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMEnAppConfigurationDestinationConfig(instanceName, name, description), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMEnAppConfigurationDestinationExists("ibm_en_destination_app_configuration.en_destination_resource_1", config), + resource.TestCheckResourceAttr("ibm_en_destination_app_configuration.en_destination_resource_1", "name", name), + resource.TestCheckResourceAttr("ibm_en_destination_app_configuration.en_destination_resource_1", "type", "app_configuration"), + resource.TestCheckResourceAttr("ibm_en_destination_app_configuration.en_destination_resource_1", "collect_failed_events", "false"), + resource.TestCheckResourceAttr("ibm_en_destination_app_configuration.en_destination_resource_1", "description", description), + ), + }, + { + Config: testAccCheckIBMEnAppConfigurationDestinationConfig(instanceName, newName, newDescription), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("ibm_en_destination_app_configuration.en_destination_resource_1", "name", newName), + resource.TestCheckResourceAttr("ibm_en_destination_app_configuration.en_destination_resource_1", "type", "app_configuration"), + resource.TestCheckResourceAttr("ibm_en_destination_app_configuration.en_destination_resource_1", "collect_failed_events", "false"), + resource.TestCheckResourceAttr("ibm_en_destination_app_configuration.en_destination_resource_1", "description", newDescription), + ), + }, + { + ResourceName: "ibm_en_destination_app_configuration.en_destination_resource_1", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccCheckIBMEnAppConfigurationDestinationConfig(instanceName, name, description string) string { + return fmt.Sprintf(` + resource "ibm_resource_instance" "en_destination_resource" { + name = "%s" + location = "us-south" + plan = "standard" + service = "event-notifications" + } + + resource "ibm_en_destination_app_configuration" "en_destination_resource_1" { + instance_guid = ibm_resource_instance.en_destination_resource.guid + name = "%s" + type = "app_configuration" + description = "%s" + config { + params { + type = "features" + crn = "crn:v1:staging:public:apprapp:us-south:a/9f007405a9fe4a5d9345fa8c131610c8:3a86a8e4-fe8b-4e43-9727-2f2cf987f1c8::" + feature_id = "cross" + environment_id = "dev" + } + } + } + `, instanceName, name, description) +} + +func testAccCheckIBMEnAppConfigurationDestinationExists(n string, obj en.Destination) resource.TestCheckFunc { + + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + enClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + return err + } + + options := &en.GetDestinationOptions{} + + parts, err := flex.SepIdParts(rs.Primary.ID, "/") + if err != nil { + return err + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + result, _, err := enClient.GetDestination(options) + if err != nil { + return err + } + + obj = *result + return nil + } +} + +func testAccCheckIBMEnAppConfigurationDestinationDestroy(s *terraform.State) error { + enClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + return err + } + for _, rs := range s.RootModule().Resources { + if rs.Type != "en_destination_resource_1" { + continue + } + + options := &en.GetDestinationOptions{} + + parts, err := flex.SepIdParts(rs.Primary.ID, "/") + if err != nil { + return err + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + // Try to find the key + _, response, err := enClient.GetDestination(options) + + if err == nil { + return fmt.Errorf("en_destination_resource_1 still exists: %s", rs.Primary.ID) + } else if response.StatusCode != 404 { + return fmt.Errorf("[ERROR] Error checking for en_destination_resource_1 (%s) has been destroyed: %s", rs.Primary.ID, err) + } + } + + return nil +} diff --git a/ibm/service/eventnotification/resource_ibm_en_destination_webhook.go b/ibm/service/eventnotification/resource_ibm_en_destination_webhook.go index 3d000c08cf..5788b909c3 100644 --- a/ibm/service/eventnotification/resource_ibm_en_destination_webhook.go +++ b/ibm/service/eventnotification/resource_ibm_en_destination_webhook.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "log" + "time" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" @@ -52,6 +53,11 @@ func ResourceIBMEnWebhookDestination() *schema.Resource { Optional: true, Description: "Whether to collect the failed event in Cloud Object Storage bucket", }, + "test_destination": { + Type: schema.TypeBool, + Optional: true, + Description: "Set flag to Test Webhook destination", + }, "config": { Type: schema.TypeList, MaxItems: 1, @@ -98,6 +104,11 @@ func ResourceIBMEnWebhookDestination() *schema.Resource { Computed: true, Description: "Destination ID", }, + "test_status": { + Type: schema.TypeString, + Computed: true, + Description: "Result destination test status", + }, "updated_at": { Type: schema.TypeString, Computed: true, @@ -148,10 +159,56 @@ func resourceIBMEnWebhookDestinationCreate(context context.Context, d *schema.Re tfErr := flex.TerraformErrorf(err, fmt.Sprintf("CreateDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_webhook", "create") log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) return tfErr.GetDiag() - // return diag.FromErr(fmt.Errorf("CreateDestinationWithContext failed %s\n%s", err, response)) } d.SetId(fmt.Sprintf("%s/%s", *options.InstanceID, *result.ID)) + testdestination := &en.TestDestinationOptions{} + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_webhook", "update") + return tfErr.GetDiag() + } + testDestination := false + if d.Get("test_destination").(bool) == true { + testdestination.SetInstanceID(parts[0]) + testdestination.SetID(parts[1]) + testDestination = true + } + + if testDestination { + testResponse, response, err := enClient.TestDestinationWithContext(context, testdestination) + if err != nil { + if response != nil && response.StatusCode != 202 { + d.SetId("") + return nil + } + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("TestDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_webhook", "test") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + // return diag.FromErr(fmt.Errorf("TestDestinationWithContext failed %s\n%s", err, response)) + } + + if test, ok := testResponse.(*en.TestDestinationResponse); ok { + if test.Status != nil { + testNotificationID := *test.NotificationID + time.Sleep(5 * time.Second) + + getNoticationOptions := &en.GetNotificationsStatusOptions{} + getNoticationOptions.SetInstanceID(parts[0]) + getNoticationOptions.SetID(testNotificationID) + + getNotificationResponse, _, notificationerr := enClient.GetNotificationsStatus(getNoticationOptions) + if notificationerr != nil { + panic(notificationerr) + } + if notificationerr = d.Set("test_status", getNotificationResponse.Status); notificationerr != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting test status: %s", notificationerr)) + } + } + + } + + } return resourceIBMEnWebhookDestinationRead(context, d, meta) } @@ -171,7 +228,6 @@ func resourceIBMEnWebhookDestinationRead(context context.Context, d *schema.Reso if err != nil { tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_webhook", "read") return tfErr.GetDiag() - // return diag.FromErr(err) } options.SetInstanceID(parts[0]) @@ -186,7 +242,6 @@ func resourceIBMEnWebhookDestinationRead(context context.Context, d *schema.Reso tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_webhook", "read") log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) return tfErr.GetDiag() - // return diag.FromErr(fmt.Errorf("GetDestinationWithContext failed %s\n%s", err, response)) } if err = d.Set("instance_guid", options.InstanceID); err != nil { @@ -244,7 +299,6 @@ func resourceIBMEnWebhookDestinationUpdate(context context.Context, d *schema.Re tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_webhook", "update") log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) return tfErr.GetDiag() - // return diag.FromErr(err) } options := &en.UpdateDestinationOptions{} @@ -253,12 +307,51 @@ func resourceIBMEnWebhookDestinationUpdate(context context.Context, d *schema.Re if err != nil { tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_webhook", "update") return tfErr.GetDiag() - // return diag.FromErr(err) } options.SetInstanceID(parts[0]) options.SetID(parts[1]) + testdestination := &en.TestDestinationOptions{} + testDestination := false + if d.Get("test_destination").(bool) == true { + testdestination.SetInstanceID(parts[0]) + testdestination.SetID(parts[1]) + testDestination = true + } + + if testDestination { + testResponse, response, err := enClient.TestDestinationWithContext(context, testdestination) + if err != nil { + if response != nil && response.StatusCode != 202 { + d.SetId("") + return nil + } + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("TestDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_webhook", "test") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + if test, ok := testResponse.(*en.TestDestinationResponse); ok { + if test.Status != nil { + testNotificationID := *test.NotificationID + time.Sleep(5 * time.Second) + + getNoticationOptions := &en.GetNotificationsStatusOptions{} + getNoticationOptions.SetInstanceID(parts[0]) + getNoticationOptions.SetID(testNotificationID) + + getNotificationResponse, _, notificationerr := enClient.GetNotificationsStatus(getNoticationOptions) + if notificationerr != nil { + panic(notificationerr) + } + if notificationerr = d.Set("test_status", getNotificationResponse.Status); notificationerr != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting test status: %s", notificationerr)) + } + } + } + } + if ok := d.HasChanges("name", "description", "collect_failed_events", "config"); ok { options.SetName(d.Get("name").(string)) @@ -279,7 +372,6 @@ func resourceIBMEnWebhookDestinationUpdate(context context.Context, d *schema.Re tfErr := flex.TerraformErrorf(err, fmt.Sprintf("UpdateDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_webhook", "update") log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) return tfErr.GetDiag() - // return diag.FromErr(fmt.Errorf("UpdateDestinationWithContext failed %s\n%s", err, response)) } return resourceIBMEnWebhookDestinationRead(context, d, meta) @@ -294,7 +386,6 @@ func resourceIBMEnWebhookDestinationDelete(context context.Context, d *schema.Re tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_webhook", "delete") log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) return tfErr.GetDiag() - // return diag.FromErr(err) } options := &en.DeleteDestinationOptions{} @@ -303,7 +394,6 @@ func resourceIBMEnWebhookDestinationDelete(context context.Context, d *schema.Re if err != nil { tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_destination_webhook", "delete") return tfErr.GetDiag() - // return diag.FromErr(err) } options.SetInstanceID(parts[0]) @@ -318,7 +408,6 @@ func resourceIBMEnWebhookDestinationDelete(context context.Context, d *schema.Re tfErr := flex.TerraformErrorf(err, fmt.Sprintf("DeleteDestinationWithContext failed: %s", err.Error()), "ibm_en_destination_webhook", "delete") log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) return tfErr.GetDiag() - // return diag.FromErr(fmt.Errorf("DeleteDestinationWithContext failed %s\n%s", err, response)) } d.SetId("") diff --git a/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration.go b/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration.go new file mode 100644 index 0000000000..77637b4ab3 --- /dev/null +++ b/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration.go @@ -0,0 +1,333 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification + +import ( + "context" + "fmt" + "log" + + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + en "github.com/IBM/event-notifications-go-admin-sdk/eventnotificationsv1" + "github.com/IBM/go-sdk-core/v5/core" +) + +func ResourceIBMEnAppConfigurationSubscription() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceIBMEnAppConfigurationSubscriptionCreate, + ReadContext: resourceIBMEnAppConfigurationSubscriptionRead, + UpdateContext: resourceIBMEnAppConfigurationSubscriptionUpdate, + DeleteContext: resourceIBMEnAppConfigurationSubscriptionDelete, + Importer: &schema.ResourceImporter{}, + + Schema: map[string]*schema.Schema{ + "instance_guid": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Unique identifier for IBM Cloud Event Notifications instance.", + }, + "name": { + Type: schema.TypeString, + Required: true, + Description: "Subscription name.", + }, + "description": { + Type: schema.TypeString, + Optional: true, + Description: "Subscription description.", + }, + "destination_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Destination ID.", + }, + "topic_id": { + Type: schema.TypeString, + Required: true, + ForceNew: true, + Description: "Topic ID.", + }, + "attributes": { + Type: schema.TypeList, + MaxItems: 1, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "template_id_notification": { + Type: schema.TypeString, + Optional: true, + Description: "The template id for notification", + }, + "feature_flag_enabled": { + Type: schema.TypeBool, + Optional: true, + Description: "App Configuration enable feature flag attribute.", + }, + }, + }, + }, + "subscription_id": { + Type: schema.TypeString, + Computed: true, + Description: "Subscription ID.", + }, + "destination_type": { + Type: schema.TypeString, + Computed: true, + Description: "The type of Destination.", + }, + "destination_name": { + Type: schema.TypeString, + Computed: true, + Description: "The Destintion name.", + }, + "topic_name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of the topic.", + }, + "updated_at": { + Type: schema.TypeString, + Computed: true, + Description: "Last updated time.", + }, + }, + } +} + +func resourceIBMEnAppConfigurationSubscriptionCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_subscription_app_configuration", "create") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.CreateSubscriptionOptions{} + + options.SetInstanceID(d.Get("instance_guid").(string)) + + options.SetName(d.Get("name").(string)) + options.SetTopicID(d.Get("topic_id").(string)) + options.SetDestinationID(d.Get("destination_id").(string)) + + if _, ok := GetFieldExists(d, "description"); ok { + options.SetDescription(d.Get("description").(string)) + } + + attributes, _ := appconfigurationsattributesMapToAttributes(d.Get("attributes.0").(map[string]interface{})) + options.SetAttributes(&attributes) + + result, _, err := enClient.CreateSubscriptionWithContext(context, options) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("CreateSubscriptionWithContext failed: %s", err.Error()), "ibm_en_subscription_app_configuration", "create") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + d.SetId(fmt.Sprintf("%s/%s", *options.InstanceID, *result.ID)) + + return resourceIBMEnAppConfigurationSubscriptionRead(context, d, meta) +} + +func resourceIBMEnAppConfigurationSubscriptionRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_subscription_app_configuration", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.GetSubscriptionOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_subscription_app_configuration", "read") + return tfErr.GetDiag() + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + result, response, err := enClient.GetSubscriptionWithContext(context, options) + if err != nil { + if response != nil && response.StatusCode == 404 { + d.SetId("") + return nil + } + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetSubscriptionWithContext failed: %s", err.Error()), "ibm_en_subscription_app_configuration", "read") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + if err = d.Set("instance_guid", options.InstanceID); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting instance_guid: %s", err)) + } + + if err = d.Set("subscription_id", result.ID); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting instance_guid: %s", err)) + } + + if err = d.Set("name", result.Name); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting name: %s", err)) + } + + if result.Description != nil { + if err = d.Set("description", result.Description); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting description: %s", err)) + } + } + + if result.From != nil { + if err = d.Set("from", result.From); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting from: %s", err)) + } + } + + if err = d.Set("destination_id", result.DestinationID); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting destination_id: %s", err)) + } + + if err = d.Set("destination_type", result.DestinationType); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting destination_type: %s", err)) + } + + if result.DestinationName != nil { + if err = d.Set("destination_name", result.DestinationName); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting destination_name: %s", err)) + } + } + + if err = d.Set("topic_id", result.TopicID); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting topic_id: %s", err)) + } + + if result.TopicName != nil { + if err = d.Set("topic_name", result.TopicName); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting topic_name: %s", err)) + } + } + + if err = d.Set("updated_at", result.UpdatedAt); err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting updated_at: %s", err)) + } + + return nil +} + +func resourceIBMEnAppConfigurationSubscriptionUpdate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_subscription_app_configuration", "update") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.UpdateSubscriptionOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_subscription_app_configuration", "update") + return tfErr.GetDiag() + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + if ok := d.HasChanges("name", "description", "attributes"); ok { + options.SetName(d.Get("name").(string)) + + if _, ok := GetFieldExists(d, "description"); ok { + options.SetDescription(d.Get("description").(string)) + } + + attributes, err := resourceIBMEnSubscriptionMapToSubscriptionAppConfigurationUpdateAttributes(d.Get("attributes.0").(map[string]interface{})) + if err != nil { + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("UpdateSubscriptionWithContext failed: %s", err.Error()), "ibm_en_subscription_app_configuration", "update") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + options.SetAttributes(&attributes) + + _, response, err := enClient.UpdateSubscriptionWithContext(context, options) + if err != nil { + return diag.FromErr(fmt.Errorf("UpdateSubscriptionWithContext failed %s\n%s", err, response)) + } + + return resourceIBMEnAppConfigurationSubscriptionRead(context, d, meta) + } + + return nil +} + +func resourceIBMEnAppConfigurationSubscriptionDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + enClient, err := meta.(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_subscription_app_configuration", "delete") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + options := &en.DeleteSubscriptionOptions{} + + parts, err := flex.SepIdParts(d.Id(), "/") + if err != nil { + tfErr := flex.TerraformErrorf(err, err.Error(), "ibm_en_subscription_app_configuration", "delete") + return tfErr.GetDiag() + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + response, err := enClient.DeleteSubscriptionWithContext(context, options) + if err != nil { + if response != nil && response.StatusCode == 404 { + d.SetId("") + return nil + } + tfErr := flex.TerraformErrorf(err, fmt.Sprintf("DeleteSubscriptionWithContext: failed: %s", err.Error()), "ibm_en_subscription_app_configuration", "delete") + log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage()) + return tfErr.GetDiag() + } + + d.SetId("") + + return nil +} + +func appconfigurationsattributesMapToAttributes(modelMap map[string]interface{}) (en.SubscriptionCreateAttributes, error) { + model := en.SubscriptionCreateAttributes{} + + if modelMap["template_id_notification"] != nil && modelMap["template_id_notification"].(string) != "" { + model.TemplateIDNotification = core.StringPtr(modelMap["template_id_notification"].(string)) + } + + if modelMap["feature_flag_enabled"] != nil { + model.FeatureFlagEnabled = core.BoolPtr(modelMap["feature_flag_enabled"].(bool)) + } + + fmt.Println(model.FeatureFlagEnabled) + + return model, nil +} + +func resourceIBMEnSubscriptionMapToSubscriptionAppConfigurationUpdateAttributes(modelMap map[string]interface{}) (en.SubscriptionUpdateAttributes, error) { + model := en.SubscriptionUpdateAttributes{} + + if modelMap["template_id_notification"] != nil && modelMap["template_id_notification"].(string) != "" { + model.TemplateIDNotification = core.StringPtr(modelMap["template_id_notification"].(string)) + } + + if modelMap["feature_flag_enabled"] != nil { + model.FeatureFlagEnabled = core.BoolPtr(modelMap["feature_flag_enabled"].(bool)) + } + + return model, nil +} diff --git a/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration_test.go b/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration_test.go new file mode 100644 index 0000000000..1bc879ec67 --- /dev/null +++ b/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration_test.go @@ -0,0 +1,173 @@ +// Copyright IBM Corp. 2021 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package eventnotification_test + +import ( + "fmt" + "testing" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + + en "github.com/IBM/event-notifications-go-admin-sdk/eventnotificationsv1" +) + +func TestAccIBMEnAppConfigurationSubscriptionAllArgs(t *testing.T) { + var conf en.Subscription + instanceName := fmt.Sprintf("tf_instance_%d", acctest.RandIntRange(10, 100)) + name := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + description := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) + newName := fmt.Sprintf("tf_name_%d", acctest.RandIntRange(10, 100)) + newDescription := fmt.Sprintf("tf_description_%d", acctest.RandIntRange(10, 100)) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIBMEnSlackSubscriptionDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMEnAppConfigurationSubscriptionConfig(instanceName, name, description), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMEnAppConfigurationSubscriptionExists("ibm_en_subscription_app_configuration.en_subscription_resource_1", conf), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "name"), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "description"), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "topic_id"), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "updated_at"), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "instance_guid"), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "destination_id"), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "destination_type"), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "subscription_id"), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "attributes.#"), + resource.TestCheckResourceAttrSet("ibm_en_subscription_app_configuration.en_subscription_resource_1", "attributes.0.signing_enabled"), + ), + }, + { + Config: testAccCheckIBMEnAppConfigurationSubscriptionConfig(instanceName, newName, newDescription), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("ibm_en_subscription_app_configuration.en_subscription_resource_1", "name", newName), + resource.TestCheckResourceAttr("ibm_en_subscription_app_configuration.en_subscription_resource_1", "description", newDescription), + ), + }, + { + ResourceName: "ibm_en_subscription_app_configuration.en_subscription_resource_1", + ImportState: true, + ImportStateVerify: false, + }, + }, + }) +} + +func testAccCheckIBMEnAppConfigurationSubscriptionConfig(instanceName, name, description string) string { + return fmt.Sprintf(` + resource "ibm_resource_instance" "en_subscription_resource" { + name = "%s" + location = "us-south" + plan = "standard" + service = "event-notifications" + } + + resource "ibm_en_topic" "en_topic_resource_2" { + instance_guid = ibm_resource_instance.en_subscription_resource.guid + name = "tf_topic_name_0234" + description = "tf_topic_description_0235" + } + + resource "ibm_en_destination_app_configuration" "en_destination_resource_2" { + instance_guid = ibm_resource_instance.en_subscription_resource.guid + name = "Tf_app_config_dest" + type = "event_streams" + description = "event_streams_destination" + config { + params { + type = "features" + crn = "crn:v1:staging:public:apprapp:us-south:a/9f007405a9fe4a5d9345fa8c131610c8:3a86a8e4-fe8b-4e43-9727-2f2cf987f1c8::" + feature_id = "cross" + environment_id = "dev" + } + } + } + resource "ibm_en_subscription_app_configuration" "en_subscription_resource_1" { + name = "%s" + description = "%s" + instance_guid = ibm_resource_instance.en_subscription_resource.guid + topic_id = ibm_en_topic.en_topic_resource_2.topic_id + destination_id = ibm_en_destination_app_configuration.en_destination_resource_2.destination_id + attributes { + feature_flag_enabled = true + } + } + `, instanceName, name, description) +} + +func testAccCheckIBMEnAppConfigurationSubscriptionExists(n string, obj en.Subscription) resource.TestCheckFunc { + + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + enClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + return err + } + + options := &en.GetSubscriptionOptions{} + + parts, err := flex.SepIdParts(rs.Primary.ID, "/") + if err != nil { + return err + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + subscription, _, err := enClient.GetSubscription(options) + if err != nil { + return err + } + + obj = *subscription + return nil + } +} + +func testAccCheckIBMEnAppConfigurationSubscriptionDestroy(s *terraform.State) error { + enClient, err := acc.TestAccProvider.Meta().(conns.ClientSession).EventNotificationsApiV1() + if err != nil { + return err + } + + for _, rs := range s.RootModule().Resources { + if rs.Type != "en_subscription_resource_1" { + continue + } + + options := &en.GetSubscriptionOptions{} + + parts, err := flex.SepIdParts(rs.Primary.ID, "/") + if err != nil { + return err + } + + options.SetInstanceID(parts[0]) + options.SetID(parts[1]) + + // Try to find the key + _, response, err := enClient.GetSubscription(options) + + if err == nil { + return fmt.Errorf("en_subscription_resource_1 still exists: %s", rs.Primary.ID) + } else if response.StatusCode != 404 { + return fmt.Errorf("[ERROR] Error checking for en_subscription_resource_1 (%s) has been destroyed: %s", rs.Primary.ID, err) + } + } + + return nil +} diff --git a/website/docs/d/en_app_configuration_template.html.markdown b/website/docs/d/en_app_configuration_template.html.markdown new file mode 100644 index 0000000000..3521889b36 --- /dev/null +++ b/website/docs/d/en_app_configuration_template.html.markdown @@ -0,0 +1,46 @@ +--- +subcategory: 'Event Notifications' +layout: 'ibm' +page_title: 'IBM : ibm_en_app_configuration_template' +description: |- + Get information about a App Configuration Template +--- + +# ibm_en_app_configuration_template + +Provides a read-only data source for App Configuration template. You can then reference the fields of the data source in other resources within the same configuration using interpolation syntax. + +## Example usage + +```terraform +data "ibm_en_app_configuration_template" "ac_template" { + instance_guid = ibm_resource_instance.en_terraform_test_resource.guid + template_id = ibm_en_app_configuration_template.ac_template.template_id +} +``` + +## Argument reference + +Review the argument reference that you can specify for your data source. + +- `instance_guid` - (Required, Forces new resource, String) Unique identifier for IBM Cloud Event Notifications instance. + +- `template_id` - (Required, String) Unique identifier for Template. + +## Attribute reference + +In addition to all argument references listed, you can access the following attribute references after your data source is created. + +- `id` - The unique identifier of the `ac_template`. + +- `name` - (String) The Template name. + +- `description` - (String) The template description. + +- `subscription_count` - (Integer) Number of subscriptions. + +- `subscription_names` - (List) List of subscriptions. + +- `type` - (String) Template type app_configuration.notification. + +- `updated_at` - (String) Last updated time. diff --git a/website/docs/d/en_destination_app_configuration.html.markdown b/website/docs/d/en_destination_app_configuration.html.markdown new file mode 100644 index 0000000000..2ef1d0e0bf --- /dev/null +++ b/website/docs/d/en_destination_app_configuration.html.markdown @@ -0,0 +1,64 @@ +--- +subcategory: 'Event Notifications' +layout: 'ibm' +page_title: 'IBM : ibm_en_destination_app_configuration' +description: |- + Get information about a App Configuration destination +--- + +# ibm_en_destination_app_configuration + +Provides a read-only data source for App Configuration destination. You can then reference the fields of the data source in other resources within the same configuration using interpolation syntax. + +## Example usage + +```terraform +data "ibm_en_destination_app_configuration" "ac_destination" { + instance_guid = ibm_resource_instance.en_terraform_test_resource.guid + destination_id = ibm_en_destination_app_configuration.ac_destination.destination_id +} +``` + +## Argument reference + +Review the argument reference that you can specify for your data source. + +- `instance_guid` - (Required, Forces new resource, String) Unique identifier for IBM Cloud Event Notifications instance. + +- `destination_id` - (Required, String) Unique identifier for Destination. + +## Attribute reference + +In addition to all argument references listed, you can access the following attribute references after your data source is created. + +- `id` - The unique identifier of the `ac_destination`. + +- `name` - (String) Destination name. + +- `description` - (String) Destination description. + +- `subscription_count` - (Integer) Number of subscriptions. + +- `subscription_names` - (List) List of subscriptions. + +- `type` - (String) Destination type app_configuration. + +- `collect_failed_events` - (boolean) Toggle switch to enable collect failed event in Cloud Object Storage bucket. + +- `config` - (List) Payload describing a destination configuration. + Nested scheme for **config**: + + - `params` - (List) + + Nested scheme for **params**: + + - `type` - (string) The App Configuration Destination type + + - `crn` - (string) CRN of the App Configuration instance + + - `environment_id` - (string) Environment ID of App Configuration + + - `feature_id` - (string) Feature ID of App Configuration + + +- `updated_at` - (String) Last updated time. diff --git a/website/docs/d/en_pre_defined_template.html.markdown b/website/docs/d/en_pre_defined_template.html.markdown index c191974eba..ad7a78ae98 100644 --- a/website/docs/d/en_pre_defined_template.html.markdown +++ b/website/docs/d/en_pre_defined_template.html.markdown @@ -3,7 +3,7 @@ layout: "ibm" page_title: "IBM : ibm_en_pre_defined_template" description: |- Get information about en_pre_defined_template -subcategory: "Event Notifications API" +subcategory: "Event Notifications" --- # ibm_en_pre_defined_template diff --git a/website/docs/d/en_subscription_app_configuration.html.markdown b/website/docs/d/en_subscription_app_configuration.html.markdown new file mode 100644 index 0000000000..bf4c8a0c13 --- /dev/null +++ b/website/docs/d/en_subscription_app_configuration.html.markdown @@ -0,0 +1,55 @@ +--- +subcategory: 'Event Notifications' +layout: 'ibm' +page_title: 'IBM : ibm_en_subscription_app_configuration' +description: |- + Get information about a App Configuration subscription +--- + +# ibm_en_subscription_app_configuration + +Provides a read-only data source for subscription. You can then reference the fields of the data source in other resources within the same configuration using interpolation syntax. + +## Example usage + +```terraform +data "ibm_en_subscription_app_configuration" "ac_subscription" { + instance_guid = ibm_resource_instance.en_terraform_test_resource.guid + subscription_id = ibm_en_subscription_app_configuration.ac_subscription.subscription_id +} +``` + +## Argument reference + +Review the argument reference that you can specify for your data source. + +- `instance_guid` - (Required, Forces new resource, String) Unique identifier for IBM Cloud Event Notifications instance. + +- `subscription_id` - (Required, String) Unique identifier for Subscription. + +## Attribute reference + +In addition to all argument references listed, you can access the following attribute references after your data source is created. + +- `id` - The unique identifier of the ac_subscription. + +- `name` - (String) Subscription name. + +- `description` - (String) Subscription description. + +- `destination_id` - (String) The destination ID. + +- `destination_name` - (String) The destination name. + +- `destination_type` - (String) The type of destination. + +- `topic_id` - (String) Topic ID. + +- `topic_name` - (String) Topic name. + +- `attributes` - (List) + + - `template_id_notification` - (String) The templete id for notification + - `feature_flag_enabled` - (String) App Configuration enable feature flag attribute. + +- `updated_at` - (String) Last updated time. diff --git a/website/docs/r/en_app_configuration_template.html.markdown b/website/docs/r/en_app_configuration_template.html.markdown new file mode 100644 index 0000000000..f57b7d0d7f --- /dev/null +++ b/website/docs/r/en_app_configuration_template.html.markdown @@ -0,0 +1,74 @@ +--- +subcategory: 'Event Notifications' +layout: 'ibm' +page_title: 'IBM : ibm_en_app_configuration_template' +description: |- + Manages Event Notification App Configuration Templates. +--- + +# ibm_en_app_configurations_template + +Create, update, or delete App Configuration Template by using IBM Cloud™ Event Notifications. + +## Example usage + +```terraform +resource "ibm_en_app_configuration_template" "ac_template" { + instance_guid = ibm_resource_instance.en_terraform_test_resource.guid + name = "App Configuration Template" + type = "app_configuration.notification" + description = "AppConfiguration Template for Notifications" + params { + body="eyJlbmFibGVkIjogZmFsc2V9Cg==" + } +} +``` + +## Argument reference + +Review the argument reference that you can specify for your resource. + +- `instance_guid` - (Required, Forces new resource, String) Unique identifier for IBM Cloud Event Notifications instance. + +- `name` - (Required, String) The Message Template. + +- `description` - (Optional, String) The Template description. + +- `type` - (Required, String) app_configuration.notification + +- `params` - (Required, List) Payload describing a template configuration + + Nested scheme for **params**: + + - `body` - (Required, String) The Body for App Configuration Template in base64 encoded format. + +## Attribute reference + +In addition to all argument references listed, you can access the following attribute references after your resource is created. + +- `id` - (String) The unique identifier of the `ac_template`. +- `template_id` - (String) The unique identifier of the created Template. +- `subscription_count` - (Integer) Number of subscriptions. + - Constraints: The minimum value is `0`. +- `subscription_names` - (List) List of subscriptions. +- `updated_at` - (String) Last updated time. + +## Import + +You can import the `ibm_en_app_configuration_template` resource by using `id`. + +The `id` property can be formed from `instance_guid`, and `template_id` in the following format: + +``` +/ +``` + +- `instance_guid`: A string. Unique identifier for IBM Cloud Event Notifications instance. + +- `template_id`: A string. Unique identifier for Template. + +**Example** + +``` +$ terraform import ibm_en_app_configuration_template.ac_template / +``` diff --git a/website/docs/r/en_destination_app_configuration.html.markdown b/website/docs/r/en_destination_app_configuration.html.markdown new file mode 100644 index 0000000000..ede05841c4 --- /dev/null +++ b/website/docs/r/en_destination_app_configuration.html.markdown @@ -0,0 +1,88 @@ +--- +subcategory: 'Event Notifications' +layout: 'ibm' +page_title: 'IBM : ibm_en_destination_app_configuration' +description: |- + Manages Event Notification App Configuration destinations. +--- + +# ibm_en_destination_app_configuration + +Create, update, or delete a App Configuration destination by using IBM Cloud™ Event Notifications. + +## Example usage + +```terraform +resource "ibm_en_destination_app_configuration" "ac_destination" { + instance_guid = ibm_resource_instance.en_terraform_test_resource.guid + name = "App Configuration EN Destination" + type = "app_configuration" + collect_failed_events = false + description = "Destination App Configuration for event notification" + config { + params { + type = "features" + crn = "crn:v1:bluemix:public:apprapp:us-south:a/4a74f2c31f554afc88156b73a1d577c6:dbxxxx93-0xxa-4xx5-axcf-c2faxxxd::" + feature_id = "test" + environment_id = "stage" + } +} +} +``` + +## Argument reference + +Review the argument reference that you can specify for your resource. + +- `instance_guid` - (Required, Forces new resource, String) Unique identifier for IBM Cloud Event Notifications instance. + +- `name` - (Required, String) The Destintion name. + +- `description` - (Optional, String) The Destination description. + +- `type` - (Required, String) msteams. + +- `collect_failed_events` - (boolean) Toggle switch to enable collect failed event in Cloud Object Storage bucket. + +- `config` - (Optional, List) Payload describing a destination configuration. + + Nested scheme for **config**: + + - `params` - (Required, List) + + Nested scheme for **params**: + + - `type` - (Required, String) The App Configuration Destination type, the only supported type is **features** currently. + - `crn` - (Required, String) CRN of the App Configuration instance. + - `environment_id` - (Required, String) Environment ID of App Configuration. + - `feature_id` - (Required, String) Feature ID of App Configuration. +## Attribute reference + +In addition to all argument references listed, you can access the following attribute references after your resource is created. + +- `id` - (String) The unique identifier of the `ac_destination`. +- `destination_id` - (String) The unique identifier of the created destination. +- `subscription_count` - (Integer) Number of subscriptions. + - Constraints: The minimum value is `0`. +- `subscription_names` - (List) List of subscriptions. +- `updated_at` - (String) Last updated time. + +## Import + +You can import the `ibm_en_destination_app_configuration` resource by using `id`. + +The `id` property can be formed from `instance_guid`, and `destination_id` in the following format: + +``` +/ +``` + +- `instance_guid`: A string. Unique identifier for IBM Cloud Event Notifications instance. + +- `destination_id`: A string. Unique identifier for Destination. + +**Example** + +``` +$ terraform import ibm_en_destination_app_configuration.ac_destination / +``` diff --git a/website/docs/r/en_destination_webhook.html.markdown b/website/docs/r/en_destination_webhook.html.markdown index b7336be1bd..6cfbc3b989 100644 --- a/website/docs/r/en_destination_webhook.html.markdown +++ b/website/docs/r/en_destination_webhook.html.markdown @@ -17,6 +17,7 @@ resource "ibm_en_destination_webhook" "webhook_en_destination" { instance_guid = ibm_resource_instance.en_terraform_test_resource.guid name = "My Webhook Destination" type = "webhook" + test_destination = true collect_failed_events = false description = "Destination webhook for event notification" config { @@ -46,6 +47,8 @@ Review the argument reference that you can specify for your resource. - `collect_failed_events` - (boolean) Toggle switch to enable collect failed event in Cloud Object Storage bucket. +- `test_destination` - (boolean) Set flag to true for webhook destination test. + - `config` - (Optional, List) Payload describing a destination configuration. Nested scheme for **config**: @@ -69,7 +72,7 @@ In addition to all argument references listed, you can access the following attr - Constraints: The minimum value is `0`. - `subscription_names` - (List) List of subscriptions. - `updated_at` - (String) Last updated time. - +- `test_status` - Webhook destination test result. The possible values are success, failed and inprogress ## Import You can import the `ibm_en_destination_webhook` resource by using `id`. diff --git a/website/docs/r/en_subscription_app_configuration.html.markdown b/website/docs/r/en_subscription_app_configuration.html.markdown new file mode 100644 index 0000000000..8d2caca7f5 --- /dev/null +++ b/website/docs/r/en_subscription_app_configuration.html.markdown @@ -0,0 +1,93 @@ +--- +subcategory: 'Event Notifications' +layout: 'ibm' +page_title: 'IBM : ibm_en_subscription_app_configuration' +description: |- + Manages Event Notifications subscription. +--- + +# ibm_en_subscription_app_configuration + +Create, update, or delete a App Configuration subscription by using IBM Cloud™ Event Notifications. + +## Example usage + +```terraform +resource "ibm_en_subscription_app_configuration" "ac_subscription" { + instance_guid = ibm_resource_instance.en_terraform_test_resource.guid + name = "EN App Config subscription" + description = "Subscription for app_configuration destination in Event Notifications" + destination_id = ibm_en_destination_app_configuration.destination1.destination_id + topic_id = ibm_en_topic.topic1.topic_id + attributes { + template_id_notification = "e40843c8-hgft-4717-8ee4-f923f2786a34" + } +} +``` + +```terraform +resource "ibm_en_subscription_app_configuration" "ac_subscription" { + instance_guid = ibm_resource_instance.en_terraform_test_resource.guid + name = "EN App Config subscription" + description = "Subscription for app_configuration destination in Event Notifications" + destination_id = ibm_en_destination_app_configuration.destination1.destination_id + topic_id = ibm_en_topic.topic1.topic_id + attributes { + feature_flag_enabled = true + } +} +``` +### :warning: Special Consideration for App Configuration Destination + +When creating or updating a subscription for an **App Configuration** destination, the `attributes` object has a specific rule: +- You must include **either** `feature_flag_enabled` **or** `template_id_notification` +- You **cannot** include both properties together +This ensures that a subscription is created for the correct use case — either **feature flag evaluation** or **notification templating**, but not both at once. + +## Argument reference + +Review the argument reference that you can specify for your resource. + +- `instance_guid` - (Required, Forces new resource, String) Unique identifier for IBM Cloud Event Notifications instance. + +- `name` - (Requires, String) Subscription name. + +- `description` - (Optional, String) Subscription description. + +- `destination_id` - (Requires, String) Destination ID. + +- `topic_id` - (Required, String) Topic ID. + +- `attributes` - (Optional, List) Subscription attributes. + Nested scheme for **attributes**: + + - `template_id_notification` - (Optional, String) The templete id for notification. + - `feature_flag_enabled` - (Optional, bool) App Configuration enable feature flag attribute. + +## Attribute reference + +In addition to all argument references listed, you can access the following attribute references after your resource is created. + +- `id` - (String) The unique identifier of the `ac_subscription`. + +- `subscription_id` - (String) The unique identifier of the created subscription. + +- `updated_at` - (String) Last updated time. + +## Import + +You can import the `ibm_en_subscription_app_configuration` resource by using `id`. +The `id` property can be formed from `instance_guid`, and `subscription_id` in the following format: + +``` +/ +``` + +- `instance_guid`: A string. Unique identifier for IBM Cloud Event Notifications instance. +- `subscription_id`: A string. Unique identifier for Subscription. + +**Example** + +``` +$ terraform import ibm_en_subscription_app_configuration.ac_subscription / +``` From df86352721aa6a8baefb8b7ab906938e8edc0f53 Mon Sep 17 00:00:00 2001 From: Divya Singh Date: Thu, 25 Sep 2025 12:33:52 +0530 Subject: [PATCH 2/3] fix: remove en local package reference from go.mod --- go.mod | 2 -- website/docs/r/en_subscription_app_configuration.html.markdown | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9d2f8b808e..6626549378 100644 --- a/go.mod +++ b/go.mod @@ -229,8 +229,6 @@ require ( replace github.com/softlayer/softlayer-go v1.0.3 => github.com/IBM-Cloud/softlayer-go v1.0.5-tf -replace github.com/IBM/event-notifications-go-admin-sdk v0.18.0 => /Users/divyasingh/Documents/EN-SDK/IBM-SDK/event-notifications-go-admin-sdk - // add sdk changes. replace github.com/portworx/sched-ops v0.0.0-20200831185134-3e8010dc7056 => github.com/portworx/sched-ops v0.20.4-openstorage-rc3 // required by rook v1.7 diff --git a/website/docs/r/en_subscription_app_configuration.html.markdown b/website/docs/r/en_subscription_app_configuration.html.markdown index 8d2caca7f5..b8f2d4d314 100644 --- a/website/docs/r/en_subscription_app_configuration.html.markdown +++ b/website/docs/r/en_subscription_app_configuration.html.markdown @@ -20,7 +20,7 @@ resource "ibm_en_subscription_app_configuration" "ac_subscription" { destination_id = ibm_en_destination_app_configuration.destination1.destination_id topic_id = ibm_en_topic.topic1.topic_id attributes { - template_id_notification = "e40843c8-hgft-4717-8ee4-f923f2786a34" + template_id_notification = "e40843c8-xxxx-4717-xxxx-f923f2786a34" } } ``` From 4704b0bb65c67632982ce456fd6e8931ad98c9e5 Mon Sep 17 00:00:00 2001 From: Divya Singh Date: Thu, 25 Sep 2025 17:07:24 +0530 Subject: [PATCH 3/3] subscription fix --- ...e_ibm_en_subscription_app_configuration.go | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration.go b/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration.go index 77637b4ab3..bc710ba083 100644 --- a/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration.go +++ b/ibm/service/eventnotification/resource_ibm_en_subscription_app_configuration.go @@ -307,26 +307,26 @@ func appconfigurationsattributesMapToAttributes(modelMap map[string]interface{}) if modelMap["template_id_notification"] != nil && modelMap["template_id_notification"].(string) != "" { model.TemplateIDNotification = core.StringPtr(modelMap["template_id_notification"].(string)) + model.FeatureFlagEnabled = nil + } else if rawVal, ok := modelMap["feature_flag_enabled"]; ok { + if boolVal, ok := rawVal.(bool); ok { + model.FeatureFlagEnabled = core.BoolPtr(boolVal) + } } - if modelMap["feature_flag_enabled"] != nil { - model.FeatureFlagEnabled = core.BoolPtr(modelMap["feature_flag_enabled"].(bool)) - } - - fmt.Println(model.FeatureFlagEnabled) - return model, nil } -func resourceIBMEnSubscriptionMapToSubscriptionAppConfigurationUpdateAttributes(modelMap map[string]interface{}) (en.SubscriptionUpdateAttributes, error) { - model := en.SubscriptionUpdateAttributes{} +func resourceIBMEnSubscriptionMapToSubscriptionAppConfigurationUpdateAttributes(modelMap map[string]interface{}) (en.SubscriptionUpdateAttributesAppConfigurationAttributes, error) { + model := en.SubscriptionUpdateAttributesAppConfigurationAttributes{} if modelMap["template_id_notification"] != nil && modelMap["template_id_notification"].(string) != "" { model.TemplateIDNotification = core.StringPtr(modelMap["template_id_notification"].(string)) - } - - if modelMap["feature_flag_enabled"] != nil { - model.FeatureFlagEnabled = core.BoolPtr(modelMap["feature_flag_enabled"].(bool)) + model.FeatureFlagEnabled = nil + } else if rawVal, ok := modelMap["feature_flag_enabled"]; ok { + if boolVal, ok := rawVal.(bool); ok { + model.FeatureFlagEnabled = core.BoolPtr(boolVal) + } } return model, nil