From 4906f59c40a830edf66d9c93a848d6b1f4fc670b Mon Sep 17 00:00:00 2001 From: Erik Ostien Date: Fri, 13 Dec 2024 13:18:00 -0700 Subject: [PATCH] PDI-1814: Add PingFederate Resource Exports - Add pingfederate_keypairs_oauth_openid_connect export - Add pingfederate_keypairs_oauth_openid_connect_additional_key_set export - Add pingfederate_kerberos_realm_settings export - Add pingfederate_idp_token_processor export - Add pingfederate_idp_to_sp_adapter_mapping export --- .../pingfederate/pingfederate_connector.go | 5 ++ .../pingfederate_connector_test.go | 25 ++++++ .../pingfederate_idp_to_sp_adapter_mapping.go | 90 +++++++++++++++++++ ...federate_idp_to_sp_adapter_mapping_test.go | 26 ++++++ .../pingfederate_idp_token_processor.go | 88 ++++++++++++++++++ .../pingfederate_idp_token_processor_test.go | 31 +++++++ .../pingfederate_kerberos_realm_settings.go | 53 +++++++++++ ...ngfederate_kerberos_realm_settings_test.go | 26 ++++++ ...gfederate_keypairs_oauth_openid_connect.go | 53 +++++++++++ ...oauth_openid_connect_additional_key_set.go | 88 ++++++++++++++++++ ..._openid_connect_additional_key_set_test.go | 26 ++++++ ...rate_keypairs_oauth_openid_connect_test.go | 26 ++++++ server-profiles/12.1/data.json.subst | 47 ++++++++++ 13 files changed, 584 insertions(+) create mode 100644 internal/connector/pingfederate/resources/pingfederate_idp_to_sp_adapter_mapping.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_idp_to_sp_adapter_mapping_test.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_idp_token_processor.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_idp_token_processor_test.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_kerberos_realm_settings.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_kerberos_realm_settings_test.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_additional_key_set.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_additional_key_set_test.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_test.go diff --git a/internal/connector/pingfederate/pingfederate_connector.go b/internal/connector/pingfederate/pingfederate_connector.go index fdcf058d..8ff48ede 100644 --- a/internal/connector/pingfederate/pingfederate_connector.go +++ b/internal/connector/pingfederate/pingfederate_connector.go @@ -61,8 +61,13 @@ func (c *PingFederateConnector) Export(format, outputDir string, overwriteExport resources.IDPAdapter(&c.clientInfo), resources.IDPSPConnection(&c.clientInfo), resources.IdpStsRequestParametersContract(&c.clientInfo), + resources.IdpTokenProcessor(&c.clientInfo), + resources.IdpToSpAdapterMapping(&c.clientInfo), resources.IncomingProxySettings(&c.clientInfo), resources.KerberosRealm(&c.clientInfo), + resources.KerberosRealmSettings(&c.clientInfo), + resources.KeypairsOauthOpenidConnect(&c.clientInfo), + resources.KeypairsOauthOpenidConnectAdditionalKeySet(&c.clientInfo), resources.LocalIdentityProfile(&c.clientInfo), resources.NotificationPublisherSettings(&c.clientInfo), resources.OAuthAccessTokenManager(&c.clientInfo), diff --git a/internal/connector/pingfederate/pingfederate_connector_test.go b/internal/connector/pingfederate/pingfederate_connector_test.go index 17dd5f8e..6a0590be 100644 --- a/internal/connector/pingfederate/pingfederate_connector_test.go +++ b/internal/connector/pingfederate/pingfederate_connector_test.go @@ -130,6 +130,16 @@ func TestPingFederateTerraformPlan(t *testing.T) { resource: resources.IdpStsRequestParametersContract(PingFederateClientInfo), ignoredErrors: nil, }, + { + name: "PingFederateIdpTokenProcessor", + resource: resources.IdpTokenProcessor(PingFederateClientInfo), + ignoredErrors: nil, + }, + { + name: "PingFederateIdpToSpAdapterMapping", + resource: resources.IdpToSpAdapterMapping(PingFederateClientInfo), + ignoredErrors: nil, + }, { name: "PingFederateIncomingProxySettings", resource: resources.IncomingProxySettings(PingFederateClientInfo), @@ -140,6 +150,21 @@ func TestPingFederateTerraformPlan(t *testing.T) { resource: resources.KerberosRealm(PingFederateClientInfo), ignoredErrors: nil, }, + { + name: "PingFederateKerberosRealmSettings", + resource: resources.KerberosRealmSettings(PingFederateClientInfo), + ignoredErrors: nil, + }, + { + name: "PingFederateKeypairsOauthOpenidConnect", + resource: resources.KeypairsOauthOpenidConnect(PingFederateClientInfo), + ignoredErrors: nil, + }, + { + name: "PingFederateKeypairsOauthOpenidConnectAdditionalKeySet", + resource: resources.KeypairsOauthOpenidConnectAdditionalKeySet(PingFederateClientInfo), + ignoredErrors: nil, + }, { name: "PingFederateLocalIdentityProfile", resource: resources.LocalIdentityProfile(PingFederateClientInfo), diff --git a/internal/connector/pingfederate/resources/pingfederate_idp_to_sp_adapter_mapping.go b/internal/connector/pingfederate/resources/pingfederate_idp_to_sp_adapter_mapping.go new file mode 100644 index 00000000..209c71c0 --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_idp_to_sp_adapter_mapping.go @@ -0,0 +1,90 @@ +package resources + +import ( + "fmt" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingFederateIdpToSpAdapterMappingResource{} +) + +type PingFederateIdpToSpAdapterMappingResource struct { + clientInfo *connector.PingFederateClientInfo +} + +// Utility method for creating a PingFederateIdpToSpAdapterMappingResource +func IdpToSpAdapterMapping(clientInfo *connector.PingFederateClientInfo) *PingFederateIdpToSpAdapterMappingResource { + return &PingFederateIdpToSpAdapterMappingResource{ + clientInfo: clientInfo, + } +} + +func (r *PingFederateIdpToSpAdapterMappingResource) ResourceType() string { + return "pingfederate_idp_to_sp_adapter_mapping" +} + +func (r *PingFederateIdpToSpAdapterMappingResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + idpToSpAdapterMappingData, err := r.getIdpToSpAdapterMappingData() + if err != nil { + return nil, err + } + + for idpToSpAdapterMappingSourceId, idpToSpAdapterMappingTargetId := range *idpToSpAdapterMappingData { + commentData := map[string]string{ + "IDP To SP Adapter Mapping IDP ID": idpToSpAdapterMappingSourceId, + "IDP To SP Adapter Mapping SP ID": idpToSpAdapterMappingTargetId, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_to_%s", idpToSpAdapterMappingSourceId, idpToSpAdapterMappingTargetId), + ResourceID: fmt.Sprintf("%s|%s", idpToSpAdapterMappingSourceId, idpToSpAdapterMappingTargetId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateIdpToSpAdapterMappingResource) getIdpToSpAdapterMappingData() (*map[string]string, error) { + idpToSpAdapterMappingData := make(map[string]string) + + idpToSpAdapterMappings, response, err := r.clientInfo.ApiClient.IdpToSpAdapterMappingAPI.GetIdpToSpAdapterMappings(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetIdpToSpAdapterMappings", r.ResourceType()) + if err != nil { + return nil, err + } + + if idpToSpAdapterMappings == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + + idpToSpAdapterMappingsItems, idpToSpAdapterMappingsItemsOk := idpToSpAdapterMappings.GetItemsOk() + if !idpToSpAdapterMappingsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } + + for _, idpToSpAdapterMapping := range idpToSpAdapterMappingsItems { + idpToSpAdapterMappingSourceId, idpToSpAdapterMappingSourceIdOk := idpToSpAdapterMapping.GetSourceIdOk() + idpToSpAdapterMappingTargetId, idpToSpAdapterMappingTargetIdOk := idpToSpAdapterMapping.GetTargetIdOk() + + if idpToSpAdapterMappingSourceIdOk && idpToSpAdapterMappingTargetIdOk { + idpToSpAdapterMappingData[*idpToSpAdapterMappingSourceId] = *idpToSpAdapterMappingTargetId + } + } + + return &idpToSpAdapterMappingData, nil +} diff --git a/internal/connector/pingfederate/resources/pingfederate_idp_to_sp_adapter_mapping_test.go b/internal/connector/pingfederate/resources/pingfederate_idp_to_sp_adapter_mapping_test.go new file mode 100644 index 00000000..e224943a --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_idp_to_sp_adapter_mapping_test.go @@ -0,0 +1,26 @@ +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils" +) + +func TestPingFederateIdpToSpAdapterMappingExport(t *testing.T) { + // Get initialized apiClient and resource + PingFederateClientInfo := testutils.GetPingFederateClientInfo(t) + resource := resources.IdpToSpAdapterMapping(PingFederateClientInfo) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: "pingfederate_idp_to_sp_adapter_mapping", + ResourceName: "ciamHtmlForm_to_spadapter", + ResourceID: "ciamHtmlForm|spadapter", + }, + } + + testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) +} diff --git a/internal/connector/pingfederate/resources/pingfederate_idp_token_processor.go b/internal/connector/pingfederate/resources/pingfederate_idp_token_processor.go new file mode 100644 index 00000000..a40a0faa --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_idp_token_processor.go @@ -0,0 +1,88 @@ +package resources + +import ( + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingFederateIdpTokenProcessorResource{} +) + +type PingFederateIdpTokenProcessorResource struct { + clientInfo *connector.PingFederateClientInfo +} + +// Utility method for creating a PingFederateIdpTokenProcessorResource +func IdpTokenProcessor(clientInfo *connector.PingFederateClientInfo) *PingFederateIdpTokenProcessorResource { + return &PingFederateIdpTokenProcessorResource{ + clientInfo: clientInfo, + } +} + +func (r *PingFederateIdpTokenProcessorResource) ResourceType() string { + return "pingfederate_idp_token_processor" +} + +func (r *PingFederateIdpTokenProcessorResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + tokenProcessorData, err := r.getTokenProcessorData() + if err != nil { + return nil, err + } + + for tokenProcessorId, tokenProcessorName := range *tokenProcessorData { + commentData := map[string]string{ + "IDP Token Processor ID": tokenProcessorId, + "IDP Token Processor Name": tokenProcessorName, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: tokenProcessorName, + ResourceID: tokenProcessorId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateIdpTokenProcessorResource) getTokenProcessorData() (*map[string]string, error) { + tokenProcessorData := make(map[string]string) + + tokenProcessors, response, err := r.clientInfo.ApiClient.IdpTokenProcessorsAPI.GetTokenProcessors(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetTokenProcessors", r.ResourceType()) + if err != nil { + return nil, err + } + + if tokenProcessors == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + + tokenProcessorsItems, tokenProcessorsItemsOk := tokenProcessors.GetItemsOk() + if !tokenProcessorsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } + + for _, tokenProcessor := range tokenProcessorsItems { + tokenProcessorId, tokenProcessorIdOk := tokenProcessor.GetIdOk() + tokenProcessorName, tokenProcessorNameOk := tokenProcessor.GetNameOk() + + if tokenProcessorIdOk && tokenProcessorNameOk { + tokenProcessorData[*tokenProcessorId] = *tokenProcessorName + } + } + + return &tokenProcessorData, nil +} diff --git a/internal/connector/pingfederate/resources/pingfederate_idp_token_processor_test.go b/internal/connector/pingfederate/resources/pingfederate_idp_token_processor_test.go new file mode 100644 index 00000000..2e6ebad8 --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_idp_token_processor_test.go @@ -0,0 +1,31 @@ +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils" +) + +func TestPingFederateIdpTokenProcessorExport(t *testing.T) { + // Get initialized apiClient and resource + PingFederateClientInfo := testutils.GetPingFederateClientInfo(t) + resource := resources.IdpTokenProcessor(PingFederateClientInfo) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: "pingfederate_idp_token_processor", + ResourceName: "UsernameTokenProcessor", + ResourceID: "UsernameTokenProcessor", + }, + { + ResourceType: "pingfederate_idp_token_processor", + ResourceName: "token processor", + ResourceID: "tokenprocessor", + }, + } + + testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) +} diff --git a/internal/connector/pingfederate/resources/pingfederate_kerberos_realm_settings.go b/internal/connector/pingfederate/resources/pingfederate_kerberos_realm_settings.go new file mode 100644 index 00000000..84156cb2 --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_kerberos_realm_settings.go @@ -0,0 +1,53 @@ +package resources + +import ( + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingFederateKerberosRealmSettingsResource{} +) + +type PingFederateKerberosRealmSettingsResource struct { + clientInfo *connector.PingFederateClientInfo +} + +// Utility method for creating a PingFederateKerberosRealmSettingsResource +func KerberosRealmSettings(clientInfo *connector.PingFederateClientInfo) *PingFederateKerberosRealmSettingsResource { + return &PingFederateKerberosRealmSettingsResource{ + clientInfo: clientInfo, + } +} + +func (r *PingFederateKerberosRealmSettingsResource) ResourceType() string { + return "pingfederate_kerberos_realm_settings" +} + +func (r *PingFederateKerberosRealmSettingsResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + kerberosRealmSettingsId := "kerberos_realm_settings_singleton_id" + kerberosRealmSettingsName := "Kerberos Realm Settings" + + commentData := map[string]string{ + "Resource Type": r.ResourceType(), + "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: kerberosRealmSettingsName, + ResourceID: kerberosRealmSettingsId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + + return &importBlocks, nil +} diff --git a/internal/connector/pingfederate/resources/pingfederate_kerberos_realm_settings_test.go b/internal/connector/pingfederate/resources/pingfederate_kerberos_realm_settings_test.go new file mode 100644 index 00000000..ca554e98 --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_kerberos_realm_settings_test.go @@ -0,0 +1,26 @@ +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils" +) + +func TestPingFederateKerberosRealmSettingsExport(t *testing.T) { + // Get initialized apiClient and resource + PingFederateClientInfo := testutils.GetPingFederateClientInfo(t) + resource := resources.KerberosRealmSettings(PingFederateClientInfo) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: "pingfederate_kerberos_realm_settings", + ResourceName: "Kerberos Realm Settings", + ResourceID: "kerberos_realm_settings_singleton_id", + }, + } + + testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) +} diff --git a/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect.go b/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect.go new file mode 100644 index 00000000..9b02c052 --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect.go @@ -0,0 +1,53 @@ +package resources + +import ( + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingFederateKeypairsOauthOpenidConnectResource{} +) + +type PingFederateKeypairsOauthOpenidConnectResource struct { + clientInfo *connector.PingFederateClientInfo +} + +// Utility method for creating a PingFederateKeypairsOauthOpenidConnectResource +func KeypairsOauthOpenidConnect(clientInfo *connector.PingFederateClientInfo) *PingFederateKeypairsOauthOpenidConnectResource { + return &PingFederateKeypairsOauthOpenidConnectResource{ + clientInfo: clientInfo, + } +} + +func (r *PingFederateKeypairsOauthOpenidConnectResource) ResourceType() string { + return "pingfederate_keypairs_oauth_openid_connect" +} + +func (r *PingFederateKeypairsOauthOpenidConnectResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + keypairsOauthOpenidConnectId := "keypairs_oauth_openid_connect_singleton_id" + keypairsOauthOpenidConnectName := "Keypairs OAuth OpenID Connect" + + commentData := map[string]string{ + "Resource Type": r.ResourceType(), + "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: keypairsOauthOpenidConnectName, + ResourceID: keypairsOauthOpenidConnectId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + + return &importBlocks, nil +} diff --git a/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_additional_key_set.go b/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_additional_key_set.go new file mode 100644 index 00000000..46554a33 --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_additional_key_set.go @@ -0,0 +1,88 @@ +package resources + +import ( + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingFederateKeypairsOauthOpenidConnectAdditionalKeySetResource{} +) + +type PingFederateKeypairsOauthOpenidConnectAdditionalKeySetResource struct { + clientInfo *connector.PingFederateClientInfo +} + +// Utility method for creating a PingFederateKerberosRealmResource +func KeypairsOauthOpenidConnectAdditionalKeySet(clientInfo *connector.PingFederateClientInfo) *PingFederateKeypairsOauthOpenidConnectAdditionalKeySetResource { + return &PingFederateKeypairsOauthOpenidConnectAdditionalKeySetResource{ + clientInfo: clientInfo, + } +} + +func (r *PingFederateKeypairsOauthOpenidConnectAdditionalKeySetResource) ResourceType() string { + return "pingfederate_keypairs_oauth_openid_connect_additional_key_set" +} + +func (r *PingFederateKeypairsOauthOpenidConnectAdditionalKeySetResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + keySetData, err := r.getKeySetData() + if err != nil { + return nil, err + } + + for keySetId, keySetName := range *keySetData { + commentData := map[string]string{ + "Keypairs OAuth OpenID Connect Addition Key Set ID": keySetId, + "Keypairs OAuth OpenID Connect Addition Key Set Name": keySetName, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: keySetName, + ResourceID: keySetId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateKeypairsOauthOpenidConnectAdditionalKeySetResource) getKeySetData() (*map[string]string, error) { + keySetData := make(map[string]string) + + keySets, response, err := r.clientInfo.ApiClient.KeyPairsOauthOpenIdConnectAPI.GetKeySets(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetKeySets", r.ResourceType()) + if err != nil { + return nil, err + } + + if keySets == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + + keySetsItems, keySetsItemsOk := keySets.GetItemsOk() + if !keySetsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } + + for _, keySet := range keySetsItems { + keySetId, keySetIdOk := keySet.GetIdOk() + keySetName, keySetNameOk := keySet.GetNameOk() + + if keySetIdOk && keySetNameOk { + keySetData[*keySetId] = *keySetName + } + } + + return &keySetData, nil +} diff --git a/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_additional_key_set_test.go b/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_additional_key_set_test.go new file mode 100644 index 00000000..a1248136 --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_additional_key_set_test.go @@ -0,0 +1,26 @@ +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils" +) + +func TestPingFederateKeypairsOauthOpenidConnectAdditionalKeySetExport(t *testing.T) { + // Get initialized apiClient and resource + PingFederateClientInfo := testutils.GetPingFederateClientInfo(t) + resource := resources.KeypairsOauthOpenidConnectAdditionalKeySet(PingFederateClientInfo) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: "pingfederate_keypairs_oauth_openid_connect_additional_key_set", + ResourceName: "testName", + ResourceID: "testID", + }, + } + + testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) +} diff --git a/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_test.go b/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_test.go new file mode 100644 index 00000000..d911b608 --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_keypairs_oauth_openid_connect_test.go @@ -0,0 +1,26 @@ +package resources_test + +import ( + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingfederate/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils" +) + +func TestPingFederateKeypairsOauthOpenidConnectExport(t *testing.T) { + // Get initialized apiClient and resource + PingFederateClientInfo := testutils.GetPingFederateClientInfo(t) + resource := resources.KeypairsOauthOpenidConnect(PingFederateClientInfo) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: "pingfederate_keypairs_oauth_openid_connect", + ResourceName: "Keypairs OAuth OpenID Connect", + ResourceID: "keypairs_oauth_openid_connect_singleton_id", + }, + } + + testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) +} diff --git a/server-profiles/12.1/data.json.subst b/server-profiles/12.1/data.json.subst index 992f5242..ed39ef82 100644 --- a/server-profiles/12.1/data.json.subst +++ b/server-profiles/12.1/data.json.subst @@ -3970,6 +3970,53 @@ "lastModified": "2024-12-13T18:59:29.324Z" } ] + }, + { + "resourceType": "/idpToSpAdapterMapping", + "operationType": "SAVE", + "items": [ + { + "attributeSources": [], + "attributeContractFulfillment": { + "subject": { + "source": { + "type": "ADAPTER" + }, + "value": "entryUUID" + } + }, + "issuanceCriteria": { + "conditionalCriteria": [] + }, + "id": "ciamHtmlForm|spadapter", + "sourceId": "ciamHtmlForm", + "targetId": "spadapter" + } + ] + }, + { + "resourceType": "/additionalKeySets", + "operationType": "SAVE", + "items": [ + { + "id": "testID", + "name": "testName", + "description": "testDescription", + "signingKeys": { + "rsaActiveCertRef": { + "id": "419x9yg43rlawqwq9v6az997k", + "location": "https://localhost:9999/pf-admin-api/v1/keyPairs/signing/419x9yg43rlawqwq9v6az997k" + }, + "rsaPublishX5cParameter": true + }, + "issuers": [ + { + "id": "BmoJwEmyzs4RSNMzVUlCs8qTPC", + "location": "https://localhost:9999/pf-admin-api/v1/oauth/issuers/BmoJwEmyzs4RSNMzVUlCs8qTPC" + } + ] + } + ] } ] }