From 150286ab24f0c4753de665da7f767fe0a3150522 Mon Sep 17 00:00:00 2001 From: Erik Ostien Date: Thu, 12 Dec 2024 13:53:26 -0700 Subject: [PATCH 1/3] Update existing PF resource exports to match PingOne export logic --- .../pingfederate_connector_test.go | 57 +++++-------- ...federate_authentication_api_application.go | 76 ++++++++--------- ...ingfederate_authentication_api_settings.go | 17 ++-- .../pingfederate_authentication_policies.go | 17 ++-- ...derate_authentication_policies_fragment.go | 76 ++++++++--------- ...derate_authentication_policies_settings.go | 17 ++-- ...federate_authentication_policy_contract.go | 76 ++++++++--------- .../pingfederate_authentication_selector.go | 76 ++++++++--------- .../resources/pingfederate_certificate_ca.go | 77 +++++++++-------- .../resources/pingfederate_data_store.go | 72 ++++++++-------- .../resources/pingfederate_default_urls.go | 17 ++-- .../pingfederate_extended_properties.go | 17 ++-- .../resources/pingfederate_idp_adapter.go | 76 ++++++++--------- .../pingfederate_idp_sp_connection.go | 76 ++++++++--------- .../pingfederate_incoming_proxy_settings.go | 17 ++-- .../resources/pingfederate_kerberos_realm.go | 74 ++++++++-------- .../pingfederate_local_identity_profile.go | 84 +++++++++---------- ...ederate_notification_publisher_settings.go | 17 ++-- ...pingfederate_oauth_access_token_manager.go | 84 +++++++++---------- ...pingfederate_oauth_access_token_mapping.go | 83 +++++++++--------- ...erate_oauth_ciba_server_policy_settings.go | 17 ++-- .../resources/pingfederate_oauth_client.go | 74 ++++++++-------- .../resources/pingfederate_oauth_issuer.go | 76 ++++++++--------- .../pingfederate_oauth_server_settings.go | 17 ++-- .../pingfederate_openid_connect_policy.go | 84 +++++++++---------- .../pingfederate_openid_connect_settings.go | 17 ++-- ...gfederate_password_credential_validator.go | 74 ++++++++-------- .../pingfederate_pingone_connection.go | 76 ++++++++--------- .../pingfederate_redirect_validation.go | 17 ++-- .../resources/pingfederate_server_settings.go | 19 +++-- .../pingfederate_server_settings_general.go | 17 ++-- ...rate_server_settings_system_keys_rotate.go | 17 ++-- .../pingfederate_server_settings_test.go | 2 +- ...pingfederate_session_application_policy.go | 17 ++-- ..._session_authentication_policies_global.go | 17 ++-- .../pingfederate_session_settings.go | 17 ++-- ..._authentication_policy_contract_mapping.go | 79 +++++++++-------- .../pingfederate_virtual_host_names.go | 17 ++-- 38 files changed, 888 insertions(+), 872 deletions(-) diff --git a/internal/connector/pingfederate/pingfederate_connector_test.go b/internal/connector/pingfederate/pingfederate_connector_test.go index 24535c86..99c203ab 100644 --- a/internal/connector/pingfederate/pingfederate_connector_test.go +++ b/internal/connector/pingfederate/pingfederate_connector_test.go @@ -35,11 +35,9 @@ func TestPingFederateTerraformPlan(t *testing.T) { ignoredErrors: nil, }, { - name: "PingFederateAuthenticationPoliciesFragment", - resource: resources.AuthenticationPoliciesFragment(PingFederateClientInfo), - ignoredErrors: []string{ - "Error: Reference to undeclared resource", - }, + name: "PingFederateAuthenticationPoliciesFragment", + resource: resources.AuthenticationPoliciesFragment(PingFederateClientInfo), + ignoredErrors: nil, }, { name: "PingFederateAuthenticationPoliciesSettings", @@ -64,11 +62,9 @@ func TestPingFederateTerraformPlan(t *testing.T) { }, }, { - name: "PingFederateDataStore", - resource: resources.DataStore(PingFederateClientInfo), - ignoredErrors: []string{ - "Error: Invalid attribute configuration", - }, + name: "PingFederateDataStore", + resource: resources.DataStore(PingFederateClientInfo), + ignoredErrors: nil, }, { name: "PingFederateDefaultURLs", @@ -81,12 +77,9 @@ func TestPingFederateTerraformPlan(t *testing.T) { ignoredErrors: nil, }, { - name: "PingFederateIDPAdapter", - resource: resources.IDPAdapter(PingFederateClientInfo), - ignoredErrors: []string{ - "Error: Missing Configuration for Required Attribute", - "Error: Reference to undeclared resource", - }, + name: "PingFederateIDPAdapter", + resource: resources.IDPAdapter(PingFederateClientInfo), + ignoredErrors: nil, }, { name: "PingFederateIDPSPConnection", @@ -99,11 +92,9 @@ func TestPingFederateTerraformPlan(t *testing.T) { ignoredErrors: nil, }, { - name: "PingFederateKerberosRealm", - resource: resources.KerberosRealm(PingFederateClientInfo), - ignoredErrors: []string{ - "Error: Invalid attribute configuration", - }, + name: "PingFederateKerberosRealm", + resource: resources.KerberosRealm(PingFederateClientInfo), + ignoredErrors: nil, }, { name: "PingFederateLocalIdentityProfile", @@ -131,11 +122,9 @@ func TestPingFederateTerraformPlan(t *testing.T) { ignoredErrors: nil, }, { - name: "PingFederateOAuthClient", - resource: resources.OAuthClient(PingFederateClientInfo), - ignoredErrors: []string{ - "Error: Invalid attribute configuration", - }, + name: "PingFederateOAuthClient", + resource: resources.OAuthClient(PingFederateClientInfo), + ignoredErrors: nil, }, { name: "PingFederateOAuthIssuer", @@ -158,18 +147,14 @@ func TestPingFederateTerraformPlan(t *testing.T) { ignoredErrors: nil, }, { - name: "PingFederatePasswordCredentialValidator", - resource: resources.PasswordCredentialValidator(PingFederateClientInfo), - ignoredErrors: []string{ - "Error: Missing Configuration for Required Attribute", - }, + name: "PingFederatePasswordCredentialValidator", + resource: resources.PasswordCredentialValidator(PingFederateClientInfo), + ignoredErrors: nil, }, { - name: "PingFederatePingOneConnection", - resource: resources.PingOneConnection(PingFederateClientInfo), - ignoredErrors: []string{ - "Error: Missing Configuration for Required Attribute", - }, + name: "PingFederatePingOneConnection", + resource: resources.PingOneConnection(PingFederateClientInfo), + ignoredErrors: nil, }, { name: "PingFederateRedirectValidation", diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_api_application.go b/internal/connector/pingfederate/resources/pingfederate_authentication_api_application.go index 98ac3827..b6412e97 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_api_application.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_api_application.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func AuthenticationApiApplication(clientInfo *connector.PingFederateClientInfo) } } +func (r *PingFederateAuthenticationApiApplicationResource) ResourceType() string { + return "pingfederate_authentication_api_application" +} + func (r *PingFederateAuthenticationApiApplicationResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.AuthenticationApiAPI.GetAuthenticationApiApplications(r.clientInfo.Context).Execute - apiFunctionName := "GetAuthenticationApiApplications" - - authnApiApplications, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + applicationData, err := r.getApplicationData() if err != nil { return nil, err } - if authnApiApplications == nil { - l.Error().Msgf("Returned %s() authnApiApplications is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } + for appId, appName := range *applicationData { + commentData := map[string]string{ + "Authentication API Application Resource ID": appId, + "Authentication API Application Resource Name": appName, + "Resource Type": r.ResourceType(), + } - authnApiApplicationsItems, ok := authnApiApplications.GetItemsOk() - if !ok { - l.Error().Msgf("Failed to get %s() authnApiApplications items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: appName, + ResourceID: appId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) } - importBlocks := []connector.ImportBlock{} + return &importBlocks, nil +} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) +func (r *PingFederateAuthenticationApiApplicationResource) getApplicationData() (*map[string]string, error) { + applicationData := make(map[string]string) + + authnApiApplications, response, err := r.clientInfo.ApiClient.AuthenticationApiAPI.GetAuthenticationApiApplications(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetAuthenticationApiApplications", r.ResourceType()) + if err != nil { + return nil, err + } + + authnApiApplicationsItems, authnApiApplicationsItemsOk := authnApiApplications.GetItemsOk() + if !authnApiApplicationsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } for _, authnApiApplication := range authnApiApplicationsItems { authnApiApplicationId, authnApiApplicationIdOk := authnApiApplication.GetIdOk() authnApiApplicationName, authnApiApplicationNameOk := authnApiApplication.GetNameOk() if authnApiApplicationIdOk && authnApiApplicationNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Authentication API Application Resource ID": *authnApiApplicationId, - "Authentication API Application Resource Name": *authnApiApplicationName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *authnApiApplicationName, - ResourceID: *authnApiApplicationId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + applicationData[*authnApiApplicationId] = *authnApiApplicationName } } - return &importBlocks, nil -} - -func (r *PingFederateAuthenticationApiApplicationResource) ResourceType() string { - return "pingfederate_authentication_api_application" + return &applicationData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_api_settings.go b/internal/connector/pingfederate/resources/pingfederate_authentication_api_settings.go index b1d932d2..4d983b97 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_api_settings.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_api_settings.go @@ -22,13 +22,16 @@ func AuthenticationApiSettings(clientInfo *connector.PingFederateClientInfo) *Pi } } +func (r *PingFederateAuthenticationApiSettingsResource) ResourceType() string { + return "pingfederate_authentication_api_settings" +} + func (r *PingFederateAuthenticationApiSettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - authnApiSettingsId := "authentication_api_settings_singleton_id" authnApiSettingsName := "Authentication API Settings" @@ -37,16 +40,14 @@ func (r *PingFederateAuthenticationApiSettingsResource) ExportAll() (*[]connecto "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: authnApiSettingsName, ResourceID: authnApiSettingsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateAuthenticationApiSettingsResource) ResourceType() string { - return "pingfederate_authentication_api_settings" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_policies.go b/internal/connector/pingfederate/resources/pingfederate_authentication_policies.go index 9763c97f..9759f12f 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_policies.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_policies.go @@ -22,13 +22,16 @@ func AuthenticationPolicies(clientInfo *connector.PingFederateClientInfo) *PingF } } +func (r *PingFederateAuthenticationPoliciesResource) ResourceType() string { + return "pingfederate_authentication_policies" +} + func (r *PingFederateAuthenticationPoliciesResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - authnPoliciesId := "authentication_policies_singleton_id" authnPoliciesName := "Authentication Policies" @@ -37,16 +40,14 @@ func (r *PingFederateAuthenticationPoliciesResource) ExportAll() (*[]connector.I "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: authnPoliciesName, ResourceID: authnPoliciesId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateAuthenticationPoliciesResource) ResourceType() string { - return "pingfederate_authentication_policies" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_policies_fragment.go b/internal/connector/pingfederate/resources/pingfederate_authentication_policies_fragment.go index b83d5f3b..39a3e031 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_policies_fragment.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_policies_fragment.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func AuthenticationPoliciesFragment(clientInfo *connector.PingFederateClientInfo } } +func (r *PingFederateAuthenticationPoliciesFragmentResource) ResourceType() string { + return "pingfederate_authentication_policies_fragment" +} + func (r *PingFederateAuthenticationPoliciesFragmentResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.AuthenticationPoliciesAPI.GetFragments(r.clientInfo.Context).Execute - apiFunctionName := "GetFragments" - - authnPoliciesFragments, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + fragmentData, err := r.getFragmentData() if err != nil { return nil, err } - if authnPoliciesFragments == nil { - l.Error().Msgf("Returned %s() authnPoliciesFragments is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } + for fragmentId, fragmentName := range *fragmentData { + commentData := map[string]string{ + "Authentication Policies Fragment Resource ID": fragmentId, + "Authentication Policies Fragment Resource Name": fragmentName, + "Resource Type": r.ResourceType(), + } - authnPoliciesFragmentsItems, ok := authnPoliciesFragments.GetItemsOk() - if !ok { - l.Error().Msgf("Failed to get %s() authnPoliciesFragment items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fragmentName, + ResourceID: fragmentId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) } - importBlocks := []connector.ImportBlock{} + return &importBlocks, nil +} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) +func (r *PingFederateAuthenticationPoliciesFragmentResource) getFragmentData() (*map[string]string, error) { + fragmentData := make(map[string]string) + + authnPoliciesFragments, response, err := r.clientInfo.ApiClient.AuthenticationPoliciesAPI.GetFragments(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetFragments", r.ResourceType()) + if err != nil { + return nil, err + } + + authnPoliciesFragmentsItems, authnPoliciesFragmentsItemsOk := authnPoliciesFragments.GetItemsOk() + if !authnPoliciesFragmentsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } for _, authnPoliciesFragment := range authnPoliciesFragmentsItems { authnPoliciesFragmentId, authnPoliciesFragmentIdOk := authnPoliciesFragment.GetIdOk() authnPoliciesFragmentName, authnPoliciesFragmentNameOk := authnPoliciesFragment.GetNameOk() if authnPoliciesFragmentIdOk && authnPoliciesFragmentNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Authentication Policies Fragment Resource ID": *authnPoliciesFragmentId, - "Authentication Policies Fragment Resource Name": *authnPoliciesFragmentName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *authnPoliciesFragmentName, - ResourceID: *authnPoliciesFragmentId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + fragmentData[*authnPoliciesFragmentId] = *authnPoliciesFragmentName } } - return &importBlocks, nil -} - -func (r *PingFederateAuthenticationPoliciesFragmentResource) ResourceType() string { - return "pingfederate_authentication_policies_fragment" + return &fragmentData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_policies_settings.go b/internal/connector/pingfederate/resources/pingfederate_authentication_policies_settings.go index b85c3288..d551199b 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_policies_settings.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_policies_settings.go @@ -22,13 +22,16 @@ func AuthenticationPoliciesSettings(clientInfo *connector.PingFederateClientInfo } } +func (r *PingFederateAuthenticationPoliciesSettingsResource) ResourceType() string { + return "pingfederate_authentication_policies_settings" +} + func (r *PingFederateAuthenticationPoliciesSettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - authnPoliciesSettingsId := "authentication_policies_settings_singleton_id" authnPoliciesSettingsName := "Authentication Policies Settings" @@ -37,16 +40,14 @@ func (r *PingFederateAuthenticationPoliciesSettingsResource) ExportAll() (*[]con "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: authnPoliciesSettingsName, ResourceID: authnPoliciesSettingsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateAuthenticationPoliciesSettingsResource) ResourceType() string { - return "pingfederate_authentication_policies_settings" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_policy_contract.go b/internal/connector/pingfederate/resources/pingfederate_authentication_policy_contract.go index a22af855..6f76c489 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_policy_contract.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_policy_contract.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func AuthenticationPolicyContract(clientInfo *connector.PingFederateClientInfo) } } +func (r *PingFederateAuthenticationPolicyContractResource) ResourceType() string { + return "pingfederate_authentication_policy_contract" +} + func (r *PingFederateAuthenticationPolicyContractResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.AuthenticationPolicyContractsAPI.GetAuthenticationPolicyContracts(r.clientInfo.Context).Execute - apiFunctionName := "GetAuthenticationPolicyContracts" - - authnPolicyContracts, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + authenticationPolicyContractData, err := r.getAuthenticationPolicyContractData() if err != nil { return nil, err } - if authnPolicyContracts == nil { - l.Error().Msgf("Returned %s() authnPolicyContracts is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } + for authnPolicyContractId, authnPolicyContractName := range *authenticationPolicyContractData { + commentData := map[string]string{ + "Authentication Policy Contract Resource ID": authnPolicyContractId, + "Authentication Policy Contract Resource Name": authnPolicyContractName, + "Resource Type": r.ResourceType(), + } - authnPolicyContractsItems, ok := authnPolicyContracts.GetItemsOk() - if !ok { - l.Error().Msgf("Failed to get %s() authnPolicyContracts items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: authnPolicyContractName, + ResourceID: authnPolicyContractId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) } - importBlocks := []connector.ImportBlock{} + return &importBlocks, nil +} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) +func (r *PingFederateAuthenticationPolicyContractResource) getAuthenticationPolicyContractData() (*map[string]string, error) { + authenticationPolicyContractData := make(map[string]string) + + authnPolicyContracts, response, err := r.clientInfo.ApiClient.AuthenticationPolicyContractsAPI.GetAuthenticationPolicyContracts(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetAuthenticationPolicyContracts", r.ResourceType()) + if err != nil { + return nil, err + } + + authnPolicyContractsItems, authnPolicyContractsItemsOk := authnPolicyContracts.GetItemsOk() + if !authnPolicyContractsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } for _, authnPolicyContract := range authnPolicyContractsItems { authnPolicyContractId, authnPolicyContractIdOk := authnPolicyContract.GetIdOk() authnPolicyContractName, authnPolicyContractNameOk := authnPolicyContract.GetNameOk() if authnPolicyContractIdOk && authnPolicyContractNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Authentication Policy Contract Resource ID": *authnPolicyContractId, - "Authentication Policy Contract Resource Name": *authnPolicyContractName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *authnPolicyContractName, - ResourceID: *authnPolicyContractId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + authenticationPolicyContractData[*authnPolicyContractId] = *authnPolicyContractName } } - return &importBlocks, nil -} - -func (r *PingFederateAuthenticationPolicyContractResource) ResourceType() string { - return "pingfederate_authentication_policy_contract" + return &authenticationPolicyContractData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_selector.go b/internal/connector/pingfederate/resources/pingfederate_authentication_selector.go index e2a21500..bc8d1041 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_selector.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_selector.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func AuthenticationSelector(clientInfo *connector.PingFederateClientInfo) *PingF } } +func (r *PingFederateAuthenticationSelectorResource) ResourceType() string { + return "pingfederate_authentication_selector" +} + func (r *PingFederateAuthenticationSelectorResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.AuthenticationSelectorsAPI.GetAuthenticationSelectors(r.clientInfo.Context).Execute - apiFunctionName := "GetAuthenticationSelectors" - - authnSelectors, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + authenticationSelectorData, err := r.getAuthenticationSelectorData() if err != nil { return nil, err } - if authnSelectors == nil { - l.Error().Msgf("Returned %s() authnSelectors is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } + for authnSelectorId, authnSelectorName := range *authenticationSelectorData { + commentData := map[string]string{ + "Authentication Selector Resource ID": authnSelectorId, + "Authentication Selector Resource Name": authnSelectorName, + "Resource Type": r.ResourceType(), + } - authnSelectorsItems, ok := authnSelectors.GetItemsOk() - if !ok { - l.Error().Msgf("Failed to get %s() authnSelectors items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: authnSelectorName, + ResourceID: authnSelectorId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) } - importBlocks := []connector.ImportBlock{} + return &importBlocks, nil +} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) +func (r *PingFederateAuthenticationSelectorResource) getAuthenticationSelectorData() (*map[string]string, error) { + authenticationSelectorData := make(map[string]string) + + authnSelectors, response, err := r.clientInfo.ApiClient.AuthenticationSelectorsAPI.GetAuthenticationSelectors(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetAuthenticationSelectors", r.ResourceType()) + if err != nil { + return nil, err + } + + authnSelectorsItems, authnSelectorsItemsOk := authnSelectors.GetItemsOk() + if !authnSelectorsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } for _, authnSelector := range authnSelectorsItems { authnSelectorId, authnSelectorIdOk := authnSelector.GetIdOk() authnSelectorName, authnSelectorNameOk := authnSelector.GetNameOk() if authnSelectorIdOk && authnSelectorNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Authentication Selector Resource ID": *authnSelectorId, - "Authentication Selector Resource Name": *authnSelectorName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *authnSelectorName, - ResourceID: *authnSelectorId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + authenticationSelectorData[*authnSelectorId] = *authnSelectorName } } - return &importBlocks, nil -} - -func (r *PingFederateAuthenticationSelectorResource) ResourceType() string { - return "pingfederate_authentication_selector" + return &authenticationSelectorData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_certificate_ca.go b/internal/connector/pingfederate/resources/pingfederate_certificate_ca.go index e8ed4ee4..7daa6e8f 100644 --- a/internal/connector/pingfederate/resources/pingfederate_certificate_ca.go +++ b/internal/connector/pingfederate/resources/pingfederate_certificate_ca.go @@ -24,63 +24,68 @@ func CertificateCA(clientInfo *connector.PingFederateClientInfo) *PingFederateCe } } +func (r *PingFederateCertificateCAResource) ResourceType() string { + return "pingfederate_certificate_ca" +} + func (r *PingFederateCertificateCAResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.CertificatesCaAPI.GetTrustedCAs(r.clientInfo.Context).Execute - apiFunctionName := "GetTrustedCAs" - - certViews, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + trustedCAData, err := r.getTrustedCAData() if err != nil { return nil, err } - if certViews == nil { - l.Error().Msgf("Returned %s() certViews is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + for certViewId, certViewInfo := range *trustedCAData { + certViewIssuerDN := certViewInfo[0] + certViewSerialNumber := certViewInfo[1] + + commentData := map[string]string{ + "Certificate CA Issuer DN": certViewIssuerDN, + "Certificate CA Resource ID": certViewId, + "Certificate CA Serial Number": certViewSerialNumber, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", certViewIssuerDN, certViewSerialNumber), + ResourceID: certViewId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateCertificateCAResource) getTrustedCAData() (*map[string][]string, error) { + trustedCAData := make(map[string][]string) + + certViews, response, err := r.clientInfo.ApiClient.CertificatesCaAPI.GetTrustedCAs(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetTrustedCAs", r.ResourceType()) + if err != nil { + return nil, err } certViewsItems, ok := certViews.GetItemsOk() if !ok { - l.Error().Msgf("Failed to get %s() certViews items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + return nil, common.DataNilError(r.ResourceType(), response) } - importBlocks := []connector.ImportBlock{} - - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - for _, certView := range certViewsItems { certViewId, certViewIdOk := certView.GetIdOk() certViewIssuerDN, certViewIssuerDNOk := certView.GetIssuerDNOk() certViewSerialNumber, certViewSerialNumberOk := certView.GetSerialNumberOk() if certViewIdOk && certViewIssuerDNOk && certViewSerialNumberOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Certificate CA Resource ID": *certViewId, - "Certificate CA Issuer DN": *certViewIssuerDN, - "Certificate CA Serial Number": *certViewSerialNumber, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", *certViewIssuerDN, *certViewSerialNumber), - ResourceID: *certViewId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + trustedCAData[*certViewId] = []string{*certViewIssuerDN, *certViewSerialNumber} } } - return &importBlocks, nil -} - -func (r *PingFederateCertificateCAResource) ResourceType() string { - return "pingfederate_certificate_ca" + return &trustedCAData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_data_store.go b/internal/connector/pingfederate/resources/pingfederate_data_store.go index fb984520..8581c8e9 100644 --- a/internal/connector/pingfederate/resources/pingfederate_data_store.go +++ b/internal/connector/pingfederate/resources/pingfederate_data_store.go @@ -24,61 +24,63 @@ func DataStore(clientInfo *connector.PingFederateClientInfo) *PingFederateDataSt } } +func (r *PingFederateDataStoreResource) ResourceType() string { + return "pingfederate_data_store" +} + func (r *PingFederateDataStoreResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.DataStoresAPI.GetDataStores(r.clientInfo.Context).Execute - apiFunctionName := "GetDataStores" - - dataStores, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + dataStoreData, err := r.getDataStoreData() if err != nil { return nil, err } - if dataStores == nil { - l.Error().Msgf("Returned %s() dataStores is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + for dataStoreId, dataStoreType := range *dataStoreData { + commentData := map[string]string{ + "Data Store Resource ID": dataStoreId, + "Data Store Type": dataStoreType, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", dataStoreId, dataStoreType), + ResourceID: dataStoreId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateDataStoreResource) getDataStoreData() (*map[string]string, error) { + dataStoreData := make(map[string]string) + + dataStores, response, err := r.clientInfo.ApiClient.DataStoresAPI.GetDataStores(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetDataStores", r.ResourceType()) + if err != nil { + return nil, err } dataStoresItems, ok := dataStores.GetItemsOk() if !ok { - l.Error().Msgf("Failed to get %s() dataStores items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + return nil, common.DataNilError(r.ResourceType(), response) } - importBlocks := []connector.ImportBlock{} - - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - for _, dataStore := range dataStoresItems { dataStoreId, dataStoreIdOk := dataStore.GetIdOk() dataStoreType, dataStoreTypeOk := dataStore.GetTypeOk() if dataStoreIdOk && dataStoreTypeOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Data Store Resource ID": *dataStoreId, - "Data Store Type": *dataStoreType, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", *dataStoreId, *dataStoreType), - ResourceID: *dataStoreId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + dataStoreData[*dataStoreId] = *dataStoreType } } - return &importBlocks, nil -} - -func (r *PingFederateDataStoreResource) ResourceType() string { - return "pingfederate_data_store" + return &dataStoreData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_default_urls.go b/internal/connector/pingfederate/resources/pingfederate_default_urls.go index 7cc1bf71..44577828 100644 --- a/internal/connector/pingfederate/resources/pingfederate_default_urls.go +++ b/internal/connector/pingfederate/resources/pingfederate_default_urls.go @@ -22,13 +22,16 @@ func DefaultURLs(clientInfo *connector.PingFederateClientInfo) *PingFederateDefa } } +func (r *PingFederateDefaultURLsResource) ResourceType() string { + return "pingfederate_default_urls" +} + func (r *PingFederateDefaultURLsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - defaultURLsId := "default_urls_singleton_id" defaultURLsName := "Default URLs" @@ -37,16 +40,14 @@ func (r *PingFederateDefaultURLsResource) ExportAll() (*[]connector.ImportBlock, "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: defaultURLsName, ResourceID: defaultURLsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateDefaultURLsResource) ResourceType() string { - return "pingfederate_default_urls" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_extended_properties.go b/internal/connector/pingfederate/resources/pingfederate_extended_properties.go index f95d1cda..8e7b8f2a 100644 --- a/internal/connector/pingfederate/resources/pingfederate_extended_properties.go +++ b/internal/connector/pingfederate/resources/pingfederate_extended_properties.go @@ -22,13 +22,16 @@ func ExtendedProperties(clientInfo *connector.PingFederateClientInfo) *PingFeder } } +func (r *PingFederateExtendedPropertiesResource) ResourceType() string { + return "pingfederate_extended_properties" +} + func (r *PingFederateExtendedPropertiesResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - extendedPropertiesId := "extended_properties_singleton_id" extendedPropertiesName := "Extended Properties" @@ -37,16 +40,14 @@ func (r *PingFederateExtendedPropertiesResource) ExportAll() (*[]connector.Impor "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: extendedPropertiesName, ResourceID: extendedPropertiesId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateExtendedPropertiesResource) ResourceType() string { - return "pingfederate_extended_properties" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_idp_adapter.go b/internal/connector/pingfederate/resources/pingfederate_idp_adapter.go index baf1ba56..3ecc0159 100644 --- a/internal/connector/pingfederate/resources/pingfederate_idp_adapter.go +++ b/internal/connector/pingfederate/resources/pingfederate_idp_adapter.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func IDPAdapter(clientInfo *connector.PingFederateClientInfo) *PingFederateIDPAd } } +func (r *PingFederateIDPAdapterResource) ResourceType() string { + return "pingfederate_idp_adapter" +} + func (r *PingFederateIDPAdapterResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.IdpAdaptersAPI.GetIdpAdapters(r.clientInfo.Context).Execute - apiFunctionName := "GetIdpAdapters" - - idpAdapters, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + idpAdapterData, err := r.getIDPAdapterData() if err != nil { return nil, err } - if idpAdapters == nil { - l.Error().Msgf("Returned %s() idpAdapters is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } + for idpAdapterId, idpAdapterName := range *idpAdapterData { + commentData := map[string]string{ + "IDP Adapter Resource ID": idpAdapterId, + "IDP Adapter Resource Name": idpAdapterName, + "Resource Type": r.ResourceType(), + } - idpAdaptersItems, ok := idpAdapters.GetItemsOk() - if !ok { - l.Error().Msgf("Failed to get %s() idpAdapters items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: idpAdapterName, + ResourceID: idpAdapterId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) } - importBlocks := []connector.ImportBlock{} + return &importBlocks, nil +} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) +func (r *PingFederateIDPAdapterResource) getIDPAdapterData() (*map[string]string, error) { + idpAdapterData := make(map[string]string) + + idpAdapters, response, err := r.clientInfo.ApiClient.IdpAdaptersAPI.GetIdpAdapters(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetIdpAdapters", r.ResourceType()) + if err != nil { + return nil, err + } + + idpAdaptersItems, idpAdaptersItemsOk := idpAdapters.GetItemsOk() + if !idpAdaptersItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } for _, idpAdapter := range idpAdaptersItems { idpAdapterId, idpAdapterIdOk := idpAdapter.GetIdOk() idpAdapterName, idpAdapterNameOk := idpAdapter.GetNameOk() if idpAdapterIdOk && idpAdapterNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "IDP Adapter Resource ID": *idpAdapterId, - "IDP Adapter Resource Name": *idpAdapterName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *idpAdapterName, - ResourceID: *idpAdapterId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + idpAdapterData[*idpAdapterId] = *idpAdapterName } } - return &importBlocks, nil -} - -func (r *PingFederateIDPAdapterResource) ResourceType() string { - return "pingfederate_idp_adapter" + return &idpAdapterData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_idp_sp_connection.go b/internal/connector/pingfederate/resources/pingfederate_idp_sp_connection.go index 11dbd1c3..8ef5e69a 100644 --- a/internal/connector/pingfederate/resources/pingfederate_idp_sp_connection.go +++ b/internal/connector/pingfederate/resources/pingfederate_idp_sp_connection.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func IDPSPConnection(clientInfo *connector.PingFederateClientInfo) *PingFederate } } +func (r *PingFederateIDPSPConnectionResource) ResourceType() string { + return "pingfederate_idp_sp_connection" +} + func (r *PingFederateIDPSPConnectionResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.IdpSpConnectionsAPI.GetSpConnections(r.clientInfo.Context).Execute - apiFunctionName := "GetSpConnections" - - spConnections, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + spConnectionData, err := r.getSpConnectionData() if err != nil { return nil, err } - if spConnections == nil { - l.Error().Msgf("Returned %s() spConnections is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } + for spConnectionId, spConnectionName := range *spConnectionData { + commentData := map[string]string{ + "IDP SP Connection Resource ID": spConnectionId, + "IDP SP Connection Resource Name": spConnectionName, + "Resource Type": r.ResourceType(), + } - spConnectionsItems, ok := spConnections.GetItemsOk() - if !ok { - l.Error().Msgf("Failed to get %s() spConnections items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: spConnectionName, + ResourceID: spConnectionId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) } - importBlocks := []connector.ImportBlock{} + return &importBlocks, nil +} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) +func (r *PingFederateIDPSPConnectionResource) getSpConnectionData() (*map[string]string, error) { + spConnectionData := make(map[string]string) + + spConnections, response, err := r.clientInfo.ApiClient.IdpSpConnectionsAPI.GetSpConnections(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetSpConnections", r.ResourceType()) + if err != nil { + return nil, err + } + + spConnectionsItems, spConnectionsItemsOk := spConnections.GetItemsOk() + if !spConnectionsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } for _, spConnection := range spConnectionsItems { spConnectionId, spConnectionIdOk := spConnection.GetIdOk() spConnectionName, spConnectionNameOk := spConnection.GetNameOk() if spConnectionIdOk && spConnectionNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "IDP SP Connection Resource ID": *spConnectionId, - "IDP SP Connection Resource Name": *spConnectionName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *spConnectionName, - ResourceID: *spConnectionId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + spConnectionData[*spConnectionId] = *spConnectionName } } - return &importBlocks, nil -} - -func (r *PingFederateIDPSPConnectionResource) ResourceType() string { - return "pingfederate_idp_sp_connection" + return &spConnectionData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_incoming_proxy_settings.go b/internal/connector/pingfederate/resources/pingfederate_incoming_proxy_settings.go index 02a12055..bfe59bf1 100644 --- a/internal/connector/pingfederate/resources/pingfederate_incoming_proxy_settings.go +++ b/internal/connector/pingfederate/resources/pingfederate_incoming_proxy_settings.go @@ -22,13 +22,16 @@ func IncomingProxySettings(clientInfo *connector.PingFederateClientInfo) *PingFe } } +func (r *PingFederateIncomingProxySettingsResource) ResourceType() string { + return "pingfederate_incoming_proxy_settings" +} + func (r *PingFederateIncomingProxySettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - incomingProxySettingsId := "incoming_proxy_settings_singleton_id" incomingProxySettingsName := "Incoming Proxy Settings" @@ -37,16 +40,14 @@ func (r *PingFederateIncomingProxySettingsResource) ExportAll() (*[]connector.Im "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: incomingProxySettingsName, ResourceID: incomingProxySettingsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateIncomingProxySettingsResource) ResourceType() string { - return "pingfederate_incoming_proxy_settings" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_kerberos_realm.go b/internal/connector/pingfederate/resources/pingfederate_kerberos_realm.go index b90e689d..49d11dcb 100644 --- a/internal/connector/pingfederate/resources/pingfederate_kerberos_realm.go +++ b/internal/connector/pingfederate/resources/pingfederate_kerberos_realm.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func KerberosRealm(clientInfo *connector.PingFederateClientInfo) *PingFederateKe } } +func (r *PingFederateKerberosRealmResource) ResourceType() string { + return "pingfederate_kerberos_realm" +} + func (r *PingFederateKerberosRealmResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.KerberosRealmsAPI.GetKerberosRealms(r.clientInfo.Context).Execute - apiFunctionName := "GetKerberosRealms" - - kerberosRealms, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + kerberosRealmData, err := r.getKerberosRealmData() if err != nil { return nil, err } - if kerberosRealms == nil { - l.Error().Msgf("Returned %s() kerberosRealms is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + for kerberosRealmId, kerberosRealmName := range *kerberosRealmData { + commentData := map[string]string{ + "Kerberos Realm Resource ID": kerberosRealmId, + "Kerberos Realm Resource Name": kerberosRealmName, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: kerberosRealmName, + ResourceID: kerberosRealmId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateKerberosRealmResource) getKerberosRealmData() (*map[string]string, error) { + kerberosRealmData := make(map[string]string) + + kerberosRealms, response, err := r.clientInfo.ApiClient.KerberosRealmsAPI.GetKerberosRealms(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetKerberosRealms", r.ResourceType()) + if err != nil { + return nil, err } kerberosRealmsItems, ok := kerberosRealms.GetItemsOk() if !ok { - l.Error().Msgf("Failed to get %s() kerberosRealms items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + return nil, common.DataNilError(r.ResourceType(), response) } - importBlocks := []connector.ImportBlock{} - - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - for _, kerberosRealm := range kerberosRealmsItems { kerberosRealmId, kerberosRealmIdOk := kerberosRealm.GetIdOk() kerberosRealmName, kerberosRealmNameOk := kerberosRealm.GetKerberosRealmNameOk() if kerberosRealmIdOk && kerberosRealmNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Kerberos Realm Resource ID": *kerberosRealmId, - "Kerberos Realm Resource Name": *kerberosRealmName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *kerberosRealmName, - ResourceID: *kerberosRealmId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + kerberosRealmData[*kerberosRealmId] = *kerberosRealmName } } - return &importBlocks, nil -} - -func (r *PingFederateKerberosRealmResource) ResourceType() string { - return "pingfederate_kerberos_realm" + return &kerberosRealmData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_local_identity_profile.go b/internal/connector/pingfederate/resources/pingfederate_local_identity_profile.go index ec0797ff..492ef4b8 100644 --- a/internal/connector/pingfederate/resources/pingfederate_local_identity_profile.go +++ b/internal/connector/pingfederate/resources/pingfederate_local_identity_profile.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func LocalIdentityProfile(clientInfo *connector.PingFederateClientInfo) *PingFed } } +func (r *PingFederateLocalIdentityProfileResource) ResourceType() string { + return "pingfederate_local_identity_profile" +} + func (r *PingFederateLocalIdentityProfileResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.LocalIdentityIdentityProfilesAPI.GetIdentityProfiles(r.clientInfo.Context).Execute - apiFunctionName := "GetIdentityProfiles" - - localIdentityProfiles, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + identityProfileData, err := r.getIdentityProfileData() if err != nil { return nil, err } - if localIdentityProfiles == nil { - l.Error().Msgf("Returned %s() localIdentityProfiles is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + for identityProfileId, identityProfileName := range *identityProfileData { + commentData := map[string]string{ + "Local Identity Profile Resource ID": identityProfileId, + "Local Identity Profile Resource Name": identityProfileName, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: identityProfileName, + ResourceID: identityProfileId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateLocalIdentityProfileResource) getIdentityProfileData() (*map[string]string, error) { + identityProfileData := make(map[string]string) + + identityProfiles, response, err := r.clientInfo.ApiClient.LocalIdentityIdentityProfilesAPI.GetIdentityProfiles(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetIdentityProfiles", r.ResourceType()) + if err != nil { + return nil, err } - localIdentityProfilesItems, ok := localIdentityProfiles.GetItemsOk() + identityProfilesItems, ok := identityProfiles.GetItemsOk() if !ok { - l.Error().Msgf("Failed to get %s() localIdentityProfiles items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + return nil, common.DataNilError(r.ResourceType(), response) } - importBlocks := []connector.ImportBlock{} + for _, identityProfile := range identityProfilesItems { + identityProfileId, identityProfileIdOk := identityProfile.GetIdOk() + identityProfileName, identityProfileNameOk := identityProfile.GetNameOk() - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - - for _, localIdentityProfile := range localIdentityProfilesItems { - localIdentityProfileId, localIdentityProfileIdOk := localIdentityProfile.GetIdOk() - localIdentityProfileName, localIdentityProfileNameOk := localIdentityProfile.GetNameOk() - - if localIdentityProfileIdOk && localIdentityProfileNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Local Identity Profile Resource ID": *localIdentityProfileId, - "Local Identity Profile Resource Name": *localIdentityProfileName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *localIdentityProfileName, - ResourceID: *localIdentityProfileId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + if identityProfileIdOk && identityProfileNameOk { + identityProfileData[*identityProfileId] = *identityProfileName } } - return &importBlocks, nil -} - -func (r *PingFederateLocalIdentityProfileResource) ResourceType() string { - return "pingfederate_local_identity_profile" + return &identityProfileData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_notification_publisher_settings.go b/internal/connector/pingfederate/resources/pingfederate_notification_publisher_settings.go index 043192c5..ed899fbb 100644 --- a/internal/connector/pingfederate/resources/pingfederate_notification_publisher_settings.go +++ b/internal/connector/pingfederate/resources/pingfederate_notification_publisher_settings.go @@ -22,13 +22,16 @@ func NotificationPublisherSettings(clientInfo *connector.PingFederateClientInfo) } } +func (r *PingFederateNotificationPublisherSettingsResource) ResourceType() string { + return "pingfederate_notification_publisher_settings" +} + func (r *PingFederateNotificationPublisherSettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - notificationPublisherSettingsId := "notification_publisher_settings_singleton_id" notificationPublisherSettingsName := "Notification Publisher Settings" @@ -37,16 +40,14 @@ func (r *PingFederateNotificationPublisherSettingsResource) ExportAll() (*[]conn "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: notificationPublisherSettingsName, ResourceID: notificationPublisherSettingsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateNotificationPublisherSettingsResource) ResourceType() string { - return "pingfederate_notification_publisher_settings" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_manager.go b/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_manager.go index c3f0eee2..330e9697 100644 --- a/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_manager.go +++ b/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_manager.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func OAuthAccessTokenManager(clientInfo *connector.PingFederateClientInfo) *Ping } } +func (r *PingFederateOAuthAccessTokenManagerResource) ResourceType() string { + return "pingfederate_oauth_access_token_manager" +} + func (r *PingFederateOAuthAccessTokenManagerResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.OauthAccessTokenManagersAPI.GetTokenManagers(r.clientInfo.Context).Execute - apiFunctionName := "GetTokenManagers" - - accessTokenManagers, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + tokenManagerData, err := r.getTokenManagerData() if err != nil { return nil, err } - if accessTokenManagers == nil { - l.Error().Msgf("Returned %s() accessTokenManagers is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + for tokenManagerId, tokenManagerName := range *tokenManagerData { + commentData := map[string]string{ + "OAuth Access Token Manager Resource ID": tokenManagerId, + "OAuth Access Token Manager Resource Name": tokenManagerName, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: tokenManagerName, + ResourceID: tokenManagerId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateOAuthAccessTokenManagerResource) getTokenManagerData() (*map[string]string, error) { + tokenManagerData := make(map[string]string) + + tokenManagers, response, err := r.clientInfo.ApiClient.OauthAccessTokenManagersAPI.GetTokenManagers(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetTokenManagers", r.ResourceType()) + if err != nil { + return nil, err } - accessTokenManagersItems, ok := accessTokenManagers.GetItemsOk() + tokenManagersItems, ok := tokenManagers.GetItemsOk() if !ok { - l.Error().Msgf("Failed to get %s() accessTokenManagers items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + return nil, common.DataNilError(r.ResourceType(), response) } - importBlocks := []connector.ImportBlock{} + for _, tokenManager := range tokenManagersItems { + tokenManagerId, tokenManagerIdOk := tokenManager.GetIdOk() + tokenManagerName, tokenManagerNameOk := tokenManager.GetNameOk() - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - - for _, accessTokenManager := range accessTokenManagersItems { - accessTokenManagerId, accessTokenManagerIdOk := accessTokenManager.GetIdOk() - accessTokenManagerName, accessTokenManagerNameOk := accessTokenManager.GetNameOk() - - if accessTokenManagerIdOk && accessTokenManagerNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "OAuth Access Token Manager Resource ID": *accessTokenManagerId, - "OAuth Access Token Manager Resource Name": *accessTokenManagerName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *accessTokenManagerName, - ResourceID: *accessTokenManagerId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + if tokenManagerIdOk && tokenManagerNameOk { + tokenManagerData[*tokenManagerId] = *tokenManagerName } } - return &importBlocks, nil -} - -func (r *PingFederateOAuthAccessTokenManagerResource) ResourceType() string { - return "pingfederate_oauth_access_token_manager" + return &tokenManagerData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_mapping.go b/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_mapping.go index f71f6208..ea512d0c 100644 --- a/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_mapping.go +++ b/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_mapping.go @@ -24,61 +24,62 @@ func OAuthAccessTokenMapping(clientInfo *connector.PingFederateClientInfo) *Ping } } +func (r *PingFederateOAuthAccessTokenMappingResource) ResourceType() string { + return "pingfederate_oauth_access_token_mapping" +} + func (r *PingFederateOAuthAccessTokenMappingResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.OauthAccessTokenMappingsAPI.GetMappings(r.clientInfo.Context).Execute - apiFunctionName := "GetMappings" - - accessTokenMappings, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + mappingData, err := r.getMappingData() if err != nil { return nil, err } - if accessTokenMappings == nil { - l.Error().Msgf("Returned %s() accessTokenMappings is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } - - importBlocks := []connector.ImportBlock{} - - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - - for _, accessTokenMapping := range accessTokenMappings { - accessTokenMappingId, accessTokenMappingIdOk := accessTokenMapping.GetIdOk() - accessTokenMappingContext, accessTokenMappingContextOk := accessTokenMapping.GetContextOk() - var ( - accessTokenMappingContextType *string - accessTokenMappingContextTypeOk bool - ) - if accessTokenMappingContextOk { - accessTokenMappingContextType, accessTokenMappingContextTypeOk = accessTokenMappingContext.GetTypeOk() + for mappingId, mappingContextType := range *mappingData { + commentData := map[string]string{ + "OAuth Access Token Mapping Resource ID": mappingId, + "OAuth Access Token Mapping Context Type": mappingContextType, + "Resource Type": r.ResourceType(), } - if accessTokenMappingIdOk && accessTokenMappingContextOk && accessTokenMappingContextTypeOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "OAuth Access Token Mapping Resource ID": *accessTokenMappingId, - "OAuth Access Token Mapping Context Type": *accessTokenMappingContextType, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_%s", *accessTokenMappingId, *accessTokenMappingContextType), - ResourceID: *accessTokenMappingId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_%s", mappingId, mappingContextType), + ResourceID: mappingId, + CommentInformation: common.GenerateCommentInformation(commentData), } + + importBlocks = append(importBlocks, importBlock) } return &importBlocks, nil } -func (r *PingFederateOAuthAccessTokenMappingResource) ResourceType() string { - return "pingfederate_oauth_access_token_mapping" +func (r *PingFederateOAuthAccessTokenMappingResource) getMappingData() (*map[string]string, error) { + mappingData := make(map[string]string) + + mappings, response, err := r.clientInfo.ApiClient.OauthAccessTokenMappingsAPI.GetMappings(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetMappings", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, mapping := range mappings { + mappingId, mappingIdOk := mapping.GetIdOk() + mappingContext, mappingContextOk := mapping.GetContextOk() + + if mappingIdOk && mappingContextOk { + mappingContextType, mappingContextTypeOk := mappingContext.GetTypeOk() + + if mappingContextTypeOk { + mappingData[*mappingId] = *mappingContextType + } + } + } + + return &mappingData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_oauth_ciba_server_policy_settings.go b/internal/connector/pingfederate/resources/pingfederate_oauth_ciba_server_policy_settings.go index 5acbfe67..93d373c5 100644 --- a/internal/connector/pingfederate/resources/pingfederate_oauth_ciba_server_policy_settings.go +++ b/internal/connector/pingfederate/resources/pingfederate_oauth_ciba_server_policy_settings.go @@ -22,13 +22,16 @@ func OAuthCIBAServerPolicySettings(clientInfo *connector.PingFederateClientInfo) } } +func (r *PingFederateOAuthCIBAServerPolicySettingsResource) ResourceType() string { + return "pingfederate_oauth_ciba_server_policy_settings" +} + func (r *PingFederateOAuthCIBAServerPolicySettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - oAuthCIBAServerPolicySettingsId := "oauth_ciba_server_policy_settings_singleton_id" oAuthCIBAServerPolicySettingsName := "OAuth CIBA Server Policy Settings" @@ -37,16 +40,14 @@ func (r *PingFederateOAuthCIBAServerPolicySettingsResource) ExportAll() (*[]conn "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: oAuthCIBAServerPolicySettingsName, ResourceID: oAuthCIBAServerPolicySettingsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateOAuthCIBAServerPolicySettingsResource) ResourceType() string { - return "pingfederate_oauth_ciba_server_policy_settings" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_oauth_client.go b/internal/connector/pingfederate/resources/pingfederate_oauth_client.go index 752080ec..286c560b 100644 --- a/internal/connector/pingfederate/resources/pingfederate_oauth_client.go +++ b/internal/connector/pingfederate/resources/pingfederate_oauth_client.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func OAuthClient(clientInfo *connector.PingFederateClientInfo) *PingFederateOAut } } +func (r *PingFederateOAuthClientResource) ResourceType() string { + return "pingfederate_oauth_client" +} + func (r *PingFederateOAuthClientResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.OauthClientsAPI.GetOauthClients(r.clientInfo.Context).Execute - apiFunctionName := "GetOauthClients" - - clients, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + oauthClientData, err := r.getOAuthClientData() if err != nil { return nil, err } - if clients == nil { - l.Error().Msgf("Returned %s() clients is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + for oauthClientId, oauthClientName := range *oauthClientData { + commentData := map[string]string{ + "OAuth Client Resource ID": oauthClientId, + "OAuth Client Resource Name": oauthClientName, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: oauthClientName, + ResourceID: oauthClientId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateOAuthClientResource) getOAuthClientData() (*map[string]string, error) { + oauthClientData := make(map[string]string) + + clients, response, err := r.clientInfo.ApiClient.OauthClientsAPI.GetOauthClients(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetOauthClients", r.ResourceType()) + if err != nil { + return nil, err } clientsItems, ok := clients.GetItemsOk() if !ok { - l.Error().Msgf("Failed to get %s() clients items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + return nil, common.DataNilError(r.ResourceType(), response) } - importBlocks := []connector.ImportBlock{} - - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - for _, client := range clientsItems { clientId, clientIdOk := client.GetClientIdOk() clientName, clientNameOk := client.GetNameOk() if clientIdOk && clientNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "OAuth Client Resource ID": *clientId, - "OAuth Client Resource Name": *clientName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *clientName, - ResourceID: *clientId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + oauthClientData[*clientId] = *clientName } } - return &importBlocks, nil -} - -func (r *PingFederateOAuthClientResource) ResourceType() string { - return "pingfederate_oauth_client" + return &oauthClientData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_oauth_issuer.go b/internal/connector/pingfederate/resources/pingfederate_oauth_issuer.go index 79d51236..5a5b2bfe 100644 --- a/internal/connector/pingfederate/resources/pingfederate_oauth_issuer.go +++ b/internal/connector/pingfederate/resources/pingfederate_oauth_issuer.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func OAuthIssuer(clientInfo *connector.PingFederateClientInfo) *PingFederateOAut } } +func (r *PingFederateOAuthIssuerResource) ResourceType() string { + return "pingfederate_oauth_issuer" +} + func (r *PingFederateOAuthIssuerResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.OauthIssuersAPI.GetOauthIssuers(r.clientInfo.Context).Execute - apiFunctionName := "GetOauthIssuers" - - issuers, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + oauthIssuerData, err := r.getOAuthIssuerData() if err != nil { return nil, err } - if issuers == nil { - l.Error().Msgf("Returned %s() issuers is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } + for oauthIssuerId, oauthIssuerName := range *oauthIssuerData { + commentData := map[string]string{ + "OAuth Issuer Resource ID": oauthIssuerId, + "OAuth Issuer Resource Name": oauthIssuerName, + "Resource Type": r.ResourceType(), + } - issuersItems, ok := issuers.GetItemsOk() - if !ok { - l.Error().Msgf("Failed to get %s() issuers items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: oauthIssuerName, + ResourceID: oauthIssuerId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) } - importBlocks := []connector.ImportBlock{} + return &importBlocks, nil +} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) +func (r *PingFederateOAuthIssuerResource) getOAuthIssuerData() (*map[string]string, error) { + issuerData := make(map[string]string) + + issuers, response, err := r.clientInfo.ApiClient.OauthIssuersAPI.GetOauthIssuers(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetOauthIssuers", r.ResourceType()) + if err != nil { + return nil, err + } + + issuersItems, issuersItemsOk := issuers.GetItemsOk() + if !issuersItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } for _, issuer := range issuersItems { issuerId, issuerIdOk := issuer.GetIdOk() issuerName, issuerNameOk := issuer.GetNameOk() if issuerIdOk && issuerNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "OAuth Issuer Resource ID": *issuerId, - "OAuth Issuer Resource Name": *issuerName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *issuerName, - ResourceID: *issuerId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + issuerData[*issuerId] = *issuerName } } - return &importBlocks, nil -} - -func (r *PingFederateOAuthIssuerResource) ResourceType() string { - return "pingfederate_oauth_issuer" + return &issuerData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_oauth_server_settings.go b/internal/connector/pingfederate/resources/pingfederate_oauth_server_settings.go index b42b146a..ee46cf1e 100644 --- a/internal/connector/pingfederate/resources/pingfederate_oauth_server_settings.go +++ b/internal/connector/pingfederate/resources/pingfederate_oauth_server_settings.go @@ -22,13 +22,16 @@ func OAuthServerSettings(clientInfo *connector.PingFederateClientInfo) *PingFede } } +func (r *PingFederateOAuthServerSettingsResource) ResourceType() string { + return "pingfederate_oauth_server_settings" +} + func (r *PingFederateOAuthServerSettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - oAuthServerSettingsId := "oauth_server_settings_singleton_id" oAuthServerSettingsName := "OAuth Server Settings" @@ -37,16 +40,14 @@ func (r *PingFederateOAuthServerSettingsResource) ExportAll() (*[]connector.Impo "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: oAuthServerSettingsName, ResourceID: oAuthServerSettingsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateOAuthServerSettingsResource) ResourceType() string { - return "pingfederate_oauth_server_settings" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_openid_connect_policy.go b/internal/connector/pingfederate/resources/pingfederate_openid_connect_policy.go index 149c618e..fe5e36c6 100644 --- a/internal/connector/pingfederate/resources/pingfederate_openid_connect_policy.go +++ b/internal/connector/pingfederate/resources/pingfederate_openid_connect_policy.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func OpenIDConnectPolicy(clientInfo *connector.PingFederateClientInfo) *PingFede } } +func (r *PingFederateOpenIDConnectPolicyResource) ResourceType() string { + return "pingfederate_openid_connect_policy" +} + func (r *PingFederateOpenIDConnectPolicyResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.OauthOpenIdConnectAPI.GetOIDCPolicies(r.clientInfo.Context).Execute - apiFunctionName := "GetOIDCPolicies" - - openIDConnectPolicies, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + oidcPolicyData, err := r.getOIDCPolicyData() if err != nil { return nil, err } - if openIDConnectPolicies == nil { - l.Error().Msgf("Returned %s() openIDConnectPolicies is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + for oidcPolicyId, oidcPolicyName := range *oidcPolicyData { + commentData := map[string]string{ + "OpenID Connect Policy Resource ID": oidcPolicyId, + "OpenID Connect Policy Resource Name": oidcPolicyName, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: oidcPolicyName, + ResourceID: oidcPolicyId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateOpenIDConnectPolicyResource) getOIDCPolicyData() (*map[string]string, error) { + oidcPolicyData := make(map[string]string) + + oidcPolicies, response, err := r.clientInfo.ApiClient.OauthOpenIdConnectAPI.GetOIDCPolicies(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetOIDCPolicies", r.ResourceType()) + if err != nil { + return nil, err } - openIDConnectPoliciesItems, ok := openIDConnectPolicies.GetItemsOk() + oidcPoliciesItems, ok := oidcPolicies.GetItemsOk() if !ok { - l.Error().Msgf("Failed to get %s() openIDConnectPolicies items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + return nil, common.DataNilError(r.ResourceType(), response) } - importBlocks := []connector.ImportBlock{} + for _, oidcPolicy := range oidcPoliciesItems { + oidcPolicyId, oidcPolicyIdOk := oidcPolicy.GetIdOk() + oidcPolicyName, oidcPolicyNameOk := oidcPolicy.GetNameOk() - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - - for _, openIDConnectPolicy := range openIDConnectPoliciesItems { - openIDConnectPolicyId, openIDConnectPolicyIdOk := openIDConnectPolicy.GetIdOk() - openIDConnectPolicyName, openIDConnectPolicyNameOk := openIDConnectPolicy.GetNameOk() - - if openIDConnectPolicyIdOk && openIDConnectPolicyNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "OpenID Connect Policy Resource ID": *openIDConnectPolicyId, - "OpenID Connect Policy Resource Name": *openIDConnectPolicyName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *openIDConnectPolicyName, - ResourceID: *openIDConnectPolicyId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + if oidcPolicyIdOk && oidcPolicyNameOk { + oidcPolicyData[*oidcPolicyId] = *oidcPolicyName } } - return &importBlocks, nil -} - -func (r *PingFederateOpenIDConnectPolicyResource) ResourceType() string { - return "pingfederate_openid_connect_policy" + return &oidcPolicyData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_openid_connect_settings.go b/internal/connector/pingfederate/resources/pingfederate_openid_connect_settings.go index 05b01c65..22f4fa0c 100644 --- a/internal/connector/pingfederate/resources/pingfederate_openid_connect_settings.go +++ b/internal/connector/pingfederate/resources/pingfederate_openid_connect_settings.go @@ -22,13 +22,16 @@ func OpenIDConnectSettings(clientInfo *connector.PingFederateClientInfo) *PingFe } } +func (r *PingFederateOpenIDConnectSettingsResource) ResourceType() string { + return "pingfederate_openid_connect_settings" +} + func (r *PingFederateOpenIDConnectSettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - openIDConnectSettingsId := "openid_connect_settings_singleton_id" openIDConnectSettingsName := "OpenID Connect Settings" @@ -37,16 +40,14 @@ func (r *PingFederateOpenIDConnectSettingsResource) ExportAll() (*[]connector.Im "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: openIDConnectSettingsName, ResourceID: openIDConnectSettingsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateOpenIDConnectSettingsResource) ResourceType() string { - return "pingfederate_openid_connect_settings" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_password_credential_validator.go b/internal/connector/pingfederate/resources/pingfederate_password_credential_validator.go index 6814b2f3..d9f7b276 100644 --- a/internal/connector/pingfederate/resources/pingfederate_password_credential_validator.go +++ b/internal/connector/pingfederate/resources/pingfederate_password_credential_validator.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func PasswordCredentialValidator(clientInfo *connector.PingFederateClientInfo) * } } +func (r *PingFederatePasswordCredentialValidatorResource) ResourceType() string { + return "pingfederate_password_credential_validator" +} + func (r *PingFederatePasswordCredentialValidatorResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.PasswordCredentialValidatorsAPI.GetPasswordCredentialValidators(r.clientInfo.Context).Execute - apiFunctionName := "GetPasswordCredentialValidators" - - passwordCredentialValidators, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + passwordCredentialValidatorData, err := r.getPasswordCredentialValidatorData() if err != nil { return nil, err } - if passwordCredentialValidators == nil { - l.Error().Msgf("Returned %s() passwordCredentialValidators is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + for passwordCredentialValidatorId, passwordCredentialValidatorName := range *passwordCredentialValidatorData { + commentData := map[string]string{ + "Password Credential Validator Resource ID": passwordCredentialValidatorId, + "Password Credential Validator Resource Name": passwordCredentialValidatorName, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: passwordCredentialValidatorName, + ResourceID: passwordCredentialValidatorId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederatePasswordCredentialValidatorResource) getPasswordCredentialValidatorData() (*map[string]string, error) { + passwordCredentialValidatorData := make(map[string]string) + + passwordCredentialValidators, response, err := r.clientInfo.ApiClient.PasswordCredentialValidatorsAPI.GetPasswordCredentialValidators(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetPasswordCredentialValidators", r.ResourceType()) + if err != nil { + return nil, err } passwordCredentialValidatorsItems, ok := passwordCredentialValidators.GetItemsOk() if !ok { - l.Error().Msgf("Failed to get %s() passwordCredentialValidators items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + return nil, common.DataNilError(r.ResourceType(), response) } - importBlocks := []connector.ImportBlock{} - - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - for _, passwordCredentialValidator := range passwordCredentialValidatorsItems { passwordCredentialValidatorId, passwordCredentialValidatorIdOk := passwordCredentialValidator.GetIdOk() passwordCredentialValidatorName, passwordCredentialValidatorNameOk := passwordCredentialValidator.GetNameOk() if passwordCredentialValidatorIdOk && passwordCredentialValidatorNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "Password Credential Validator Resource ID": *passwordCredentialValidatorId, - "Password Credential Validator Resource Name": *passwordCredentialValidatorName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *passwordCredentialValidatorName, - ResourceID: *passwordCredentialValidatorId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + passwordCredentialValidatorData[*passwordCredentialValidatorId] = *passwordCredentialValidatorName } } - return &importBlocks, nil -} - -func (r *PingFederatePasswordCredentialValidatorResource) ResourceType() string { - return "pingfederate_password_credential_validator" + return &passwordCredentialValidatorData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_pingone_connection.go b/internal/connector/pingfederate/resources/pingfederate_pingone_connection.go index c751e7a1..491668e9 100644 --- a/internal/connector/pingfederate/resources/pingfederate_pingone_connection.go +++ b/internal/connector/pingfederate/resources/pingfederate_pingone_connection.go @@ -1,8 +1,6 @@ package resources import ( - "fmt" - "github.com/pingidentity/pingcli/internal/connector" "github.com/pingidentity/pingcli/internal/connector/common" "github.com/pingidentity/pingcli/internal/logger" @@ -24,61 +22,63 @@ func PingOneConnection(clientInfo *connector.PingFederateClientInfo) *PingFedera } } +func (r *PingFederatePingOneConnectionResource) ResourceType() string { + return "pingfederate_pingone_connection" +} + func (r *PingFederatePingOneConnectionResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.PingOneConnectionsAPI.GetPingOneConnections(r.clientInfo.Context).Execute - apiFunctionName := "GetPingOneConnections" - - pingoneConnections, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + pingoneConnectionData, err := r.getPingOneConnectionData() if err != nil { return nil, err } - if pingoneConnections == nil { - l.Error().Msgf("Returned %s() pingoneConnections is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } + for pingoneConnectionId, pingoneConnectionName := range *pingoneConnectionData { + commentData := map[string]string{ + "PingOne Connection Resource ID": pingoneConnectionId, + "PingOne Connection Resource Name": pingoneConnectionName, + "Resource Type": r.ResourceType(), + } - pingoneConnectionsItems, ok := pingoneConnections.GetItemsOk() - if !ok { - l.Error().Msgf("Failed to get %s() pingoneConnections items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: pingoneConnectionName, + ResourceID: pingoneConnectionId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) } - importBlocks := []connector.ImportBlock{} + return &importBlocks, nil +} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) +func (r *PingFederatePingOneConnectionResource) getPingOneConnectionData() (*map[string]string, error) { + pingoneConnectionData := make(map[string]string) + + pingoneConnections, response, err := r.clientInfo.ApiClient.PingOneConnectionsAPI.GetPingOneConnections(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetPingOneConnections", r.ResourceType()) + if err != nil { + return nil, err + } + + pingoneConnectionsItems, pingoneConnectionsItemsOk := pingoneConnections.GetItemsOk() + if !pingoneConnectionsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } for _, pingoneConnection := range pingoneConnectionsItems { pingoneConnectionId, pingoneConnectionIdOk := pingoneConnection.GetIdOk() pingoneConnectionName, pingoneConnectionNameOk := pingoneConnection.GetNameOk() if pingoneConnectionIdOk && pingoneConnectionNameOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "PingOne Connection Resource ID": *pingoneConnectionId, - "PingOne Connection Resource Name": *pingoneConnectionName, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: *pingoneConnectionName, - ResourceID: *pingoneConnectionId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + pingoneConnectionData[*pingoneConnectionId] = *pingoneConnectionName } } - return &importBlocks, nil -} - -func (r *PingFederatePingOneConnectionResource) ResourceType() string { - return "pingfederate_pingone_connection" + return &pingoneConnectionData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_redirect_validation.go b/internal/connector/pingfederate/resources/pingfederate_redirect_validation.go index ae160566..e562bfdc 100644 --- a/internal/connector/pingfederate/resources/pingfederate_redirect_validation.go +++ b/internal/connector/pingfederate/resources/pingfederate_redirect_validation.go @@ -22,13 +22,16 @@ func RedirectValidation(clientInfo *connector.PingFederateClientInfo) *PingFeder } } +func (r *PingFederateRedirectValidationResource) ResourceType() string { + return "pingfederate_redirect_validation" +} + func (r *PingFederateRedirectValidationResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - redirectValidationId := "redirect_validation_singleton_id" redirectValidationName := "Redirect Validation" @@ -37,16 +40,14 @@ func (r *PingFederateRedirectValidationResource) ExportAll() (*[]connector.Impor "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: redirectValidationName, ResourceID: redirectValidationId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateRedirectValidationResource) ResourceType() string { - return "pingfederate_redirect_validation" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_server_settings.go b/internal/connector/pingfederate/resources/pingfederate_server_settings.go index 445349c1..e4a951ed 100644 --- a/internal/connector/pingfederate/resources/pingfederate_server_settings.go +++ b/internal/connector/pingfederate/resources/pingfederate_server_settings.go @@ -22,14 +22,17 @@ func ServerSettings(clientInfo *connector.PingFederateClientInfo) *PingFederateS } } +func (r *PingFederateServerSettingsResource) ResourceType() string { + return "pingfederate_server_settings" +} + func (r *PingFederateServerSettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - - serverSettingsId := "server_settings_singleton_id" + serverSettingsId := "pingfederate_server_settings_singleton_id" serverSettingsName := "Server Settings" commentData := map[string]string{ @@ -37,16 +40,14 @@ func (r *PingFederateServerSettingsResource) ExportAll() (*[]connector.ImportBlo "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: serverSettingsName, ResourceID: serverSettingsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateServerSettingsResource) ResourceType() string { - return "pingfederate_server_settings" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_server_settings_general.go b/internal/connector/pingfederate/resources/pingfederate_server_settings_general.go index 8c71e672..0304318e 100644 --- a/internal/connector/pingfederate/resources/pingfederate_server_settings_general.go +++ b/internal/connector/pingfederate/resources/pingfederate_server_settings_general.go @@ -22,13 +22,16 @@ func ServerSettingsGeneral(clientInfo *connector.PingFederateClientInfo) *PingFe } } +func (r *PingFederateServerSettingsGeneralResource) ResourceType() string { + return "pingfederate_server_settings_general" +} + func (r *PingFederateServerSettingsGeneralResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - serverSettingsGeneralId := "pingfederate_server_settings_general_singleton_id" serverSettingsGeneralName := "Server Settings General" @@ -37,16 +40,14 @@ func (r *PingFederateServerSettingsGeneralResource) ExportAll() (*[]connector.Im "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: serverSettingsGeneralName, ResourceID: serverSettingsGeneralId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateServerSettingsGeneralResource) ResourceType() string { - return "pingfederate_server_settings_general" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_server_settings_system_keys_rotate.go b/internal/connector/pingfederate/resources/pingfederate_server_settings_system_keys_rotate.go index a35b30de..77e264bc 100644 --- a/internal/connector/pingfederate/resources/pingfederate_server_settings_system_keys_rotate.go +++ b/internal/connector/pingfederate/resources/pingfederate_server_settings_system_keys_rotate.go @@ -22,13 +22,16 @@ func ServerSettingsSystemKeysRotate(clientInfo *connector.PingFederateClientInfo } } +func (r *PingFederateServerSettingsSystemKeysRotateResource) ResourceType() string { + return "pingfederate_server_settings_system_keys_rotate" +} + func (r *PingFederateServerSettingsSystemKeysRotateResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - serverSettingsSystemKeysRotateId := "server_settings_system_keys_rotate_singleton_id" serverSettingsSystemKeysRotateName := "Server Settings System Keys Rotate" @@ -37,16 +40,14 @@ func (r *PingFederateServerSettingsSystemKeysRotateResource) ExportAll() (*[]con "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: serverSettingsSystemKeysRotateName, ResourceID: serverSettingsSystemKeysRotateId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateServerSettingsSystemKeysRotateResource) ResourceType() string { - return "pingfederate_server_settings_system_keys_rotate" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_server_settings_test.go b/internal/connector/pingfederate/resources/pingfederate_server_settings_test.go index dca0856d..de1f2d82 100644 --- a/internal/connector/pingfederate/resources/pingfederate_server_settings_test.go +++ b/internal/connector/pingfederate/resources/pingfederate_server_settings_test.go @@ -18,7 +18,7 @@ func TestPingFederateServerSettingsExport(t *testing.T) { { ResourceType: "pingfederate_server_settings", ResourceName: "Server Settings", - ResourceID: "server_settings_singleton_id", + ResourceID: "pingfederate_server_settings_singleton_id", }, } diff --git a/internal/connector/pingfederate/resources/pingfederate_session_application_policy.go b/internal/connector/pingfederate/resources/pingfederate_session_application_policy.go index 37839d7a..3769d8f0 100644 --- a/internal/connector/pingfederate/resources/pingfederate_session_application_policy.go +++ b/internal/connector/pingfederate/resources/pingfederate_session_application_policy.go @@ -22,13 +22,16 @@ func SessionApplicationPolicy(clientInfo *connector.PingFederateClientInfo) *Pin } } +func (r *PingFederateSessionApplicationPolicyResource) ResourceType() string { + return "pingfederate_session_application_policy" +} + func (r *PingFederateSessionApplicationPolicyResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - sessionApplicationPolicyId := "pingfederate_session_application_policy_singleton_id" sessionApplicationPolicyName := "Session Application Policy" @@ -37,16 +40,14 @@ func (r *PingFederateSessionApplicationPolicyResource) ExportAll() (*[]connector "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: sessionApplicationPolicyName, ResourceID: sessionApplicationPolicyId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateSessionApplicationPolicyResource) ResourceType() string { - return "pingfederate_session_application_policy" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_session_authentication_policies_global.go b/internal/connector/pingfederate/resources/pingfederate_session_authentication_policies_global.go index 7094ada9..3e4d8dea 100644 --- a/internal/connector/pingfederate/resources/pingfederate_session_authentication_policies_global.go +++ b/internal/connector/pingfederate/resources/pingfederate_session_authentication_policies_global.go @@ -22,13 +22,16 @@ func SessionAuthenticationPoliciesGlobal(clientInfo *connector.PingFederateClien } } +func (r *PingFederateSessionAuthenticationPoliciesGlobalResource) ResourceType() string { + return "pingfederate_session_authentication_policies_global" +} + func (r *PingFederateSessionAuthenticationPoliciesGlobalResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - sessionAuthenticationPoliciesGlobalId := "pingfederate_session_authentication_policies_global_singleton_id" sessionAuthenticationPoliciesGlobalName := "Session Authentication Policies Global" @@ -37,16 +40,14 @@ func (r *PingFederateSessionAuthenticationPoliciesGlobalResource) ExportAll() (* "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: sessionAuthenticationPoliciesGlobalName, ResourceID: sessionAuthenticationPoliciesGlobalId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateSessionAuthenticationPoliciesGlobalResource) ResourceType() string { - return "pingfederate_session_authentication_policies_global" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_session_settings.go b/internal/connector/pingfederate/resources/pingfederate_session_settings.go index 5fc993ed..23283a30 100644 --- a/internal/connector/pingfederate/resources/pingfederate_session_settings.go +++ b/internal/connector/pingfederate/resources/pingfederate_session_settings.go @@ -22,13 +22,16 @@ func SessionSettings(clientInfo *connector.PingFederateClientInfo) *PingFederate } } +func (r *PingFederateSessionSettingsResource) ResourceType() string { + return "pingfederate_session_settings" +} + func (r *PingFederateSessionSettingsResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - sessionSettingsId := "session_settings_singleton_id" sessionSettingsName := "Session Settings" @@ -37,16 +40,14 @@ func (r *PingFederateSessionSettingsResource) ExportAll() (*[]connector.ImportBl "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: sessionSettingsName, ResourceID: sessionSettingsId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateSessionSettingsResource) ResourceType() string { - return "pingfederate_session_settings" + return &importBlocks, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_sp_authentication_policy_contract_mapping.go b/internal/connector/pingfederate/resources/pingfederate_sp_authentication_policy_contract_mapping.go index a70ab7f8..01bd62d2 100644 --- a/internal/connector/pingfederate/resources/pingfederate_sp_authentication_policy_contract_mapping.go +++ b/internal/connector/pingfederate/resources/pingfederate_sp_authentication_policy_contract_mapping.go @@ -24,37 +24,58 @@ func SPAuthenticationPolicyContractMapping(clientInfo *connector.PingFederateCli } } +func (r *PingFederateSPAuthenticationPolicyContractMappingResource) ResourceType() string { + return "pingfederate_sp_authentication_policy_contract_mapping" +} + func (r *PingFederateSPAuthenticationPolicyContractMappingResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) - l.Debug().Msgf("Fetching all %s resources...", r.ResourceType()) - - apiExecuteFunc := r.clientInfo.ApiClient.SpAuthenticationPolicyContractMappingsAPI.GetApcToSpAdapterMappings(r.clientInfo.Context).Execute - apiFunctionName := "GetApcToSpAdapterMappings" - - apcToSpAdapterMappings, response, err := apiExecuteFunc() + importBlocks := []connector.ImportBlock{} - err = common.HandleClientResponse(response, err, apiFunctionName, r.ResourceType()) + apcToSpAdapterMappingData, err := r.getApcToSpAdapterMappingData() if err != nil { return nil, err } - if apcToSpAdapterMappings == nil { - l.Error().Msgf("Returned %s() apcToSpAdapterMappings is nil.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) - } + for apcToSpAdapterMappingId, apcToSpAdapterMappingInfo := range *apcToSpAdapterMappingData { + apcToSpAdapterMappingSourceID := apcToSpAdapterMappingInfo[0] + apcToSpAdapterMappingTargetID := apcToSpAdapterMappingInfo[1] + + commentData := map[string]string{ + "Resource Type": r.ResourceType(), + "Source Authentication Policy Contract Resource ID": apcToSpAdapterMappingSourceID, + "SP Authentication Policy Contract Mapping Resource ID": apcToSpAdapterMappingId, + "Target SP Adapter Resource ID": apcToSpAdapterMappingTargetID, + } - apcToSpAdapterMappingsItems, ok := apcToSpAdapterMappings.GetItemsOk() - if !ok { - l.Error().Msgf("Failed to get %s() apcToSpAdapterMappings items.", apiFunctionName) - l.Error().Msgf("%s Response Code: %s\nResponse Body: %s", apiFunctionName, response.Status, response.Body) - return nil, fmt.Errorf("failed to fetch %s resources via %s()", r.ResourceType(), apiFunctionName) + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_to_%s", apcToSpAdapterMappingSourceID, apcToSpAdapterMappingTargetID), + ResourceID: apcToSpAdapterMappingId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) } - importBlocks := []connector.ImportBlock{} + return &importBlocks, nil +} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) +func (r *PingFederateSPAuthenticationPolicyContractMappingResource) getApcToSpAdapterMappingData() (*map[string][]string, error) { + apcToSpAdapterMappingData := make(map[string][]string) + + apcToSpAdapterMappings, response, err := r.clientInfo.ApiClient.SpAuthenticationPolicyContractMappingsAPI.GetApcToSpAdapterMappings(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetApcToSpAdapterMappings", r.ResourceType()) + if err != nil { + return nil, err + } + + apcToSpAdapterMappingsItems, apcToSpAdapterMappingsItemsOk := apcToSpAdapterMappings.GetItemsOk() + if !apcToSpAdapterMappingsItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } for _, apcToSpAdapterMapping := range apcToSpAdapterMappingsItems { apcToSpAdapterMappingId, apcToSpAdapterMappingIdOk := apcToSpAdapterMapping.GetIdOk() @@ -62,25 +83,9 @@ func (r *PingFederateSPAuthenticationPolicyContractMappingResource) ExportAll() apcToSpAdapterMappingTargetID, apcToSpAdapterMappingTargetIDOk := apcToSpAdapterMapping.GetTargetIdOk() if apcToSpAdapterMappingIdOk && apcToSpAdapterMappingSourceIDOk && apcToSpAdapterMappingTargetIDOk { - commentData := map[string]string{ - "Resource Type": r.ResourceType(), - "SP Authentication Policy Contract Mapping Resource ID": *apcToSpAdapterMappingId, - "Source Authentication Policy Contract Resource ID": *apcToSpAdapterMappingSourceID, - "Target SP Adapter Resource ID": *apcToSpAdapterMappingTargetID, - } - - importBlocks = append(importBlocks, connector.ImportBlock{ - ResourceType: r.ResourceType(), - ResourceName: fmt.Sprintf("%s_to_%s", *apcToSpAdapterMappingSourceID, *apcToSpAdapterMappingTargetID), - ResourceID: *apcToSpAdapterMappingId, - CommentInformation: common.GenerateCommentInformation(commentData), - }) + apcToSpAdapterMappingData[*apcToSpAdapterMappingId] = []string{*apcToSpAdapterMappingSourceID, *apcToSpAdapterMappingTargetID} } } - return &importBlocks, nil -} - -func (r *PingFederateSPAuthenticationPolicyContractMappingResource) ResourceType() string { - return "pingfederate_sp_authentication_policy_contract_mapping" + return &apcToSpAdapterMappingData, nil } diff --git a/internal/connector/pingfederate/resources/pingfederate_virtual_host_names.go b/internal/connector/pingfederate/resources/pingfederate_virtual_host_names.go index 51f1ecd1..d20069a2 100644 --- a/internal/connector/pingfederate/resources/pingfederate_virtual_host_names.go +++ b/internal/connector/pingfederate/resources/pingfederate_virtual_host_names.go @@ -22,13 +22,16 @@ func VirtualHostNames(clientInfo *connector.PingFederateClientInfo) *PingFederat } } +func (r *PingFederateVirtualHostNamesResource) ResourceType() string { + return "pingfederate_virtual_host_names" +} + func (r *PingFederateVirtualHostNamesResource) ExportAll() (*[]connector.ImportBlock, error) { l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) importBlocks := []connector.ImportBlock{} - l.Debug().Msgf("Generating Import Blocks for all %s resources...", r.ResourceType()) - virtualHostNamesId := "virtual_host_names_singleton_id" virtualHostNamesName := "Virtual Host Names" @@ -37,16 +40,14 @@ func (r *PingFederateVirtualHostNamesResource) ExportAll() (*[]connector.ImportB "Singleton ID": common.SINGLETON_ID_COMMENT_DATA, } - importBlocks = append(importBlocks, connector.ImportBlock{ + importBlock := connector.ImportBlock{ ResourceType: r.ResourceType(), ResourceName: virtualHostNamesName, ResourceID: virtualHostNamesId, CommentInformation: common.GenerateCommentInformation(commentData), - }) + } - return &importBlocks, nil -} + importBlocks = append(importBlocks, importBlock) -func (r *PingFederateVirtualHostNamesResource) ResourceType() string { - return "pingfederate_virtual_host_names" + return &importBlocks, nil } From 02746ed80fc324d6c2f9d51b3a54db4ab51731d9 Mon Sep 17 00:00:00 2001 From: Erik Ostien Date: Thu, 12 Dec 2024 14:11:36 -0700 Subject: [PATCH 2/3] Add PF resource export for pingfederate_captcha_provider --- .../pingfederate/pingfederate_connector.go | 1 + .../pingfederate_connector_test.go | 5 ++ .../pingfederate_captcha_provider.go | 88 +++++++++++++++++++ .../pingfederate_captcha_provider_test.go | 31 +++++++ 4 files changed, 125 insertions(+) create mode 100644 internal/connector/pingfederate/resources/pingfederate_captcha_provider.go create mode 100644 internal/connector/pingfederate/resources/pingfederate_captcha_provider_test.go diff --git a/internal/connector/pingfederate/pingfederate_connector.go b/internal/connector/pingfederate/pingfederate_connector.go index 1611c973..39d8632a 100644 --- a/internal/connector/pingfederate/pingfederate_connector.go +++ b/internal/connector/pingfederate/pingfederate_connector.go @@ -47,6 +47,7 @@ func (c *PingFederateConnector) Export(format, outputDir string, overwriteExport resources.AuthenticationPoliciesSettings(&c.clientInfo), resources.AuthenticationPolicyContract(&c.clientInfo), resources.AuthenticationSelector(&c.clientInfo), + resources.CaptchaProvider(&c.clientInfo), resources.CertificateCA(&c.clientInfo), resources.DataStore(&c.clientInfo), resources.DefaultURLs(&c.clientInfo), diff --git a/internal/connector/pingfederate/pingfederate_connector_test.go b/internal/connector/pingfederate/pingfederate_connector_test.go index 99c203ab..a5396b05 100644 --- a/internal/connector/pingfederate/pingfederate_connector_test.go +++ b/internal/connector/pingfederate/pingfederate_connector_test.go @@ -54,6 +54,11 @@ func TestPingFederateTerraformPlan(t *testing.T) { resource: resources.AuthenticationSelector(PingFederateClientInfo), ignoredErrors: nil, }, + { + name: "PingFederateCaptchaProvider", + resource: resources.CaptchaProvider(PingFederateClientInfo), + ignoredErrors: nil, + }, { name: "PingFederateCertificateCA", resource: resources.CertificateCA(PingFederateClientInfo), diff --git a/internal/connector/pingfederate/resources/pingfederate_captcha_provider.go b/internal/connector/pingfederate/resources/pingfederate_captcha_provider.go new file mode 100644 index 00000000..3774e56d --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_captcha_provider.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 = &PingFederateCaptchaProviderResource{} +) + +type PingFederateCaptchaProviderResource struct { + clientInfo *connector.PingFederateClientInfo +} + +// Utility method for creating a PingFederateCaptchaProviderResource +func CaptchaProvider(clientInfo *connector.PingFederateClientInfo) *PingFederateCaptchaProviderResource { + return &PingFederateCaptchaProviderResource{ + clientInfo: clientInfo, + } +} + +func (r *PingFederateCaptchaProviderResource) ResourceType() string { + return "pingfederate_captcha_provider" +} + +func (r *PingFederateCaptchaProviderResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + captchaProviderData, err := r.getCaptchaProviderData() + if err != nil { + return nil, err + } + + for captchaProviderId, captchaProviderName := range *captchaProviderData { + commentData := map[string]string{ + "Captcha Provider Resource ID": captchaProviderId, + "Captcha Provider Resource Name": captchaProviderId, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: captchaProviderName, + ResourceID: captchaProviderId, + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingFederateCaptchaProviderResource) getCaptchaProviderData() (*map[string]string, error) { + captchaProviderData := make(map[string]string) + + captchaProviders, response, err := r.clientInfo.ApiClient.CaptchaProvidersAPI.GetCaptchaProviders(r.clientInfo.Context).Execute() + err = common.HandleClientResponse(response, err, "GetCaptchaProviders", r.ResourceType()) + if err != nil { + return nil, err + } + + if captchaProviders == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + + captchaProvidersItems, captchaProvidersItemsOk := captchaProviders.GetItemsOk() + if !captchaProvidersItemsOk { + return nil, common.DataNilError(r.ResourceType(), response) + } + + for _, captchaProvider := range captchaProvidersItems { + captchaProviderId, captchaProviderIdOk := captchaProvider.GetIdOk() + captchaProviderName, captchaProviderNameOk := captchaProvider.GetNameOk() + + if captchaProviderIdOk && captchaProviderNameOk { + captchaProviderData[*captchaProviderId] = *captchaProviderName + } + } + + return &captchaProviderData, nil +} diff --git a/internal/connector/pingfederate/resources/pingfederate_captcha_provider_test.go b/internal/connector/pingfederate/resources/pingfederate_captcha_provider_test.go new file mode 100644 index 00000000..55d9b6ee --- /dev/null +++ b/internal/connector/pingfederate/resources/pingfederate_captcha_provider_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 TestPingFederateCaptchaProviderExport(t *testing.T) { + // Get initialized apiClient and resource + PingFederateClientInfo := testutils.GetPingFederateClientInfo(t) + resource := resources.CaptchaProvider(PingFederateClientInfo) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: "pingfederate_captcha_provider", + ResourceName: "exampleCaptchaProviderV2", + ResourceID: "exampleCaptchaProviderV2", + }, + { + ResourceType: "pingfederate_captcha_provider", + ResourceName: "exampleCaptchaProvider", + ResourceID: "exampleCaptchaProvider", + }, + } + + testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) +} From 595391f7abe5a29f8c81bc6becab7d1310f73349 Mon Sep 17 00:00:00 2001 From: Erik Ostien Date: Thu, 12 Dec 2024 14:17:26 -0700 Subject: [PATCH 3/3] Add PF nil check on api response objects --- .../resources/pingfederate_authentication_api_application.go | 4 ++++ .../pingfederate_authentication_policies_fragment.go | 4 ++++ .../resources/pingfederate_authentication_policy_contract.go | 4 ++++ .../resources/pingfederate_authentication_selector.go | 4 ++++ .../pingfederate/resources/pingfederate_certificate_ca.go | 4 ++++ .../pingfederate/resources/pingfederate_data_store.go | 4 ++++ .../pingfederate/resources/pingfederate_idp_adapter.go | 4 ++++ .../pingfederate/resources/pingfederate_idp_sp_connection.go | 4 ++++ .../pingfederate/resources/pingfederate_kerberos_realm.go | 4 ++++ .../resources/pingfederate_local_identity_profile.go | 4 ++++ .../resources/pingfederate_oauth_access_token_manager.go | 4 ++++ .../pingfederate/resources/pingfederate_oauth_client.go | 4 ++++ .../pingfederate/resources/pingfederate_oauth_issuer.go | 4 ++++ .../resources/pingfederate_openid_connect_policy.go | 4 ++++ .../resources/pingfederate_password_credential_validator.go | 4 ++++ .../pingfederate/resources/pingfederate_pingone_connection.go | 4 ++++ .../pingfederate_sp_authentication_policy_contract_mapping.go | 4 ++++ 17 files changed, 68 insertions(+) diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_api_application.go b/internal/connector/pingfederate/resources/pingfederate_authentication_api_application.go index b6412e97..b8555db6 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_api_application.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_api_application.go @@ -66,6 +66,10 @@ func (r *PingFederateAuthenticationApiApplicationResource) getApplicationData() return nil, err } + if authnApiApplications == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + authnApiApplicationsItems, authnApiApplicationsItemsOk := authnApiApplications.GetItemsOk() if !authnApiApplicationsItemsOk { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_policies_fragment.go b/internal/connector/pingfederate/resources/pingfederate_authentication_policies_fragment.go index 39a3e031..bb59aa65 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_policies_fragment.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_policies_fragment.go @@ -66,6 +66,10 @@ func (r *PingFederateAuthenticationPoliciesFragmentResource) getFragmentData() ( return nil, err } + if authnPoliciesFragments == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + authnPoliciesFragmentsItems, authnPoliciesFragmentsItemsOk := authnPoliciesFragments.GetItemsOk() if !authnPoliciesFragmentsItemsOk { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_policy_contract.go b/internal/connector/pingfederate/resources/pingfederate_authentication_policy_contract.go index 6f76c489..63fc547f 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_policy_contract.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_policy_contract.go @@ -66,6 +66,10 @@ func (r *PingFederateAuthenticationPolicyContractResource) getAuthenticationPoli return nil, err } + if authnPolicyContracts == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + authnPolicyContractsItems, authnPolicyContractsItemsOk := authnPolicyContracts.GetItemsOk() if !authnPolicyContractsItemsOk { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_authentication_selector.go b/internal/connector/pingfederate/resources/pingfederate_authentication_selector.go index bc8d1041..8c135e1e 100644 --- a/internal/connector/pingfederate/resources/pingfederate_authentication_selector.go +++ b/internal/connector/pingfederate/resources/pingfederate_authentication_selector.go @@ -66,6 +66,10 @@ func (r *PingFederateAuthenticationSelectorResource) getAuthenticationSelectorDa return nil, err } + if authnSelectors == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + authnSelectorsItems, authnSelectorsItemsOk := authnSelectors.GetItemsOk() if !authnSelectorsItemsOk { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_certificate_ca.go b/internal/connector/pingfederate/resources/pingfederate_certificate_ca.go index 7daa6e8f..16280cb1 100644 --- a/internal/connector/pingfederate/resources/pingfederate_certificate_ca.go +++ b/internal/connector/pingfederate/resources/pingfederate_certificate_ca.go @@ -72,6 +72,10 @@ func (r *PingFederateCertificateCAResource) getTrustedCAData() (*map[string][]st return nil, err } + if certViews == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + certViewsItems, ok := certViews.GetItemsOk() if !ok { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_data_store.go b/internal/connector/pingfederate/resources/pingfederate_data_store.go index 8581c8e9..3a45507c 100644 --- a/internal/connector/pingfederate/resources/pingfederate_data_store.go +++ b/internal/connector/pingfederate/resources/pingfederate_data_store.go @@ -68,6 +68,10 @@ func (r *PingFederateDataStoreResource) getDataStoreData() (*map[string]string, return nil, err } + if dataStores == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + dataStoresItems, ok := dataStores.GetItemsOk() if !ok { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_idp_adapter.go b/internal/connector/pingfederate/resources/pingfederate_idp_adapter.go index 3ecc0159..89d984b1 100644 --- a/internal/connector/pingfederate/resources/pingfederate_idp_adapter.go +++ b/internal/connector/pingfederate/resources/pingfederate_idp_adapter.go @@ -66,6 +66,10 @@ func (r *PingFederateIDPAdapterResource) getIDPAdapterData() (*map[string]string return nil, err } + if idpAdapters == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + idpAdaptersItems, idpAdaptersItemsOk := idpAdapters.GetItemsOk() if !idpAdaptersItemsOk { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_idp_sp_connection.go b/internal/connector/pingfederate/resources/pingfederate_idp_sp_connection.go index 8ef5e69a..145a56b9 100644 --- a/internal/connector/pingfederate/resources/pingfederate_idp_sp_connection.go +++ b/internal/connector/pingfederate/resources/pingfederate_idp_sp_connection.go @@ -66,6 +66,10 @@ func (r *PingFederateIDPSPConnectionResource) getSpConnectionData() (*map[string return nil, err } + if spConnections == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + spConnectionsItems, spConnectionsItemsOk := spConnections.GetItemsOk() if !spConnectionsItemsOk { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_kerberos_realm.go b/internal/connector/pingfederate/resources/pingfederate_kerberos_realm.go index 49d11dcb..f48b3db1 100644 --- a/internal/connector/pingfederate/resources/pingfederate_kerberos_realm.go +++ b/internal/connector/pingfederate/resources/pingfederate_kerberos_realm.go @@ -66,6 +66,10 @@ func (r *PingFederateKerberosRealmResource) getKerberosRealmData() (*map[string] return nil, err } + if kerberosRealms == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + kerberosRealmsItems, ok := kerberosRealms.GetItemsOk() if !ok { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_local_identity_profile.go b/internal/connector/pingfederate/resources/pingfederate_local_identity_profile.go index 492ef4b8..252179e8 100644 --- a/internal/connector/pingfederate/resources/pingfederate_local_identity_profile.go +++ b/internal/connector/pingfederate/resources/pingfederate_local_identity_profile.go @@ -66,6 +66,10 @@ func (r *PingFederateLocalIdentityProfileResource) getIdentityProfileData() (*ma return nil, err } + if identityProfiles == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + identityProfilesItems, ok := identityProfiles.GetItemsOk() if !ok { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_manager.go b/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_manager.go index 330e9697..add169f0 100644 --- a/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_manager.go +++ b/internal/connector/pingfederate/resources/pingfederate_oauth_access_token_manager.go @@ -66,6 +66,10 @@ func (r *PingFederateOAuthAccessTokenManagerResource) getTokenManagerData() (*ma return nil, err } + if tokenManagers == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + tokenManagersItems, ok := tokenManagers.GetItemsOk() if !ok { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_oauth_client.go b/internal/connector/pingfederate/resources/pingfederate_oauth_client.go index 286c560b..7ebf4847 100644 --- a/internal/connector/pingfederate/resources/pingfederate_oauth_client.go +++ b/internal/connector/pingfederate/resources/pingfederate_oauth_client.go @@ -66,6 +66,10 @@ func (r *PingFederateOAuthClientResource) getOAuthClientData() (*map[string]stri return nil, err } + if clients == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + clientsItems, ok := clients.GetItemsOk() if !ok { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_oauth_issuer.go b/internal/connector/pingfederate/resources/pingfederate_oauth_issuer.go index 5a5b2bfe..97127cca 100644 --- a/internal/connector/pingfederate/resources/pingfederate_oauth_issuer.go +++ b/internal/connector/pingfederate/resources/pingfederate_oauth_issuer.go @@ -66,6 +66,10 @@ func (r *PingFederateOAuthIssuerResource) getOAuthIssuerData() (*map[string]stri return nil, err } + if issuers == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + issuersItems, issuersItemsOk := issuers.GetItemsOk() if !issuersItemsOk { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_openid_connect_policy.go b/internal/connector/pingfederate/resources/pingfederate_openid_connect_policy.go index fe5e36c6..d6a3231d 100644 --- a/internal/connector/pingfederate/resources/pingfederate_openid_connect_policy.go +++ b/internal/connector/pingfederate/resources/pingfederate_openid_connect_policy.go @@ -66,6 +66,10 @@ func (r *PingFederateOpenIDConnectPolicyResource) getOIDCPolicyData() (*map[stri return nil, err } + if oidcPolicies == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + oidcPoliciesItems, ok := oidcPolicies.GetItemsOk() if !ok { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_password_credential_validator.go b/internal/connector/pingfederate/resources/pingfederate_password_credential_validator.go index d9f7b276..7f557bcb 100644 --- a/internal/connector/pingfederate/resources/pingfederate_password_credential_validator.go +++ b/internal/connector/pingfederate/resources/pingfederate_password_credential_validator.go @@ -66,6 +66,10 @@ func (r *PingFederatePasswordCredentialValidatorResource) getPasswordCredentialV return nil, err } + if passwordCredentialValidators == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + passwordCredentialValidatorsItems, ok := passwordCredentialValidators.GetItemsOk() if !ok { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_pingone_connection.go b/internal/connector/pingfederate/resources/pingfederate_pingone_connection.go index 491668e9..9e10e444 100644 --- a/internal/connector/pingfederate/resources/pingfederate_pingone_connection.go +++ b/internal/connector/pingfederate/resources/pingfederate_pingone_connection.go @@ -66,6 +66,10 @@ func (r *PingFederatePingOneConnectionResource) getPingOneConnectionData() (*map return nil, err } + if pingoneConnections == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + pingoneConnectionsItems, pingoneConnectionsItemsOk := pingoneConnections.GetItemsOk() if !pingoneConnectionsItemsOk { return nil, common.DataNilError(r.ResourceType(), response) diff --git a/internal/connector/pingfederate/resources/pingfederate_sp_authentication_policy_contract_mapping.go b/internal/connector/pingfederate/resources/pingfederate_sp_authentication_policy_contract_mapping.go index 01bd62d2..8a090def 100644 --- a/internal/connector/pingfederate/resources/pingfederate_sp_authentication_policy_contract_mapping.go +++ b/internal/connector/pingfederate/resources/pingfederate_sp_authentication_policy_contract_mapping.go @@ -72,6 +72,10 @@ func (r *PingFederateSPAuthenticationPolicyContractMappingResource) getApcToSpAd return nil, err } + if apcToSpAdapterMappings == nil { + return nil, common.DataNilError(r.ResourceType(), response) + } + apcToSpAdapterMappingsItems, apcToSpAdapterMappingsItemsOk := apcToSpAdapterMappings.GetItemsOk() if !apcToSpAdapterMappingsItemsOk { return nil, common.DataNilError(r.ResourceType(), response)