diff --git a/internal/connector/pingone/sso/pingone_sso_connector.go b/internal/connector/pingone/sso/pingone_sso_connector.go index 6fd004ce..d4aa38fc 100644 --- a/internal/connector/pingone/sso/pingone_sso_connector.go +++ b/internal/connector/pingone/sso/pingone_sso_connector.go @@ -57,6 +57,7 @@ func (c *PingOneSSOConnector) Export(format, outputDir string, overwriteExport b resources.PasswordPolicy(&c.clientInfo), resources.Population(&c.clientInfo), resources.PopulationDefault(&c.clientInfo), + resources.PopulationDefaultIdp(&c.clientInfo), resources.Resource(&c.clientInfo), resources.ResourceAttribute(&c.clientInfo), resources.ResourceScope(&c.clientInfo), diff --git a/internal/connector/pingone/sso/pingone_sso_connector_test.go b/internal/connector/pingone/sso/pingone_sso_connector_test.go index 86b350dd..2edc68ca 100644 --- a/internal/connector/pingone/sso/pingone_sso_connector_test.go +++ b/internal/connector/pingone/sso/pingone_sso_connector_test.go @@ -94,6 +94,11 @@ func TestSSOTerraformPlan(t *testing.T) { resource: resources.PopulationDefault(PingOneClientInfo), ignoredErrors: nil, }, + { + name: "PopulationDefaultIdp", + resource: resources.PopulationDefaultIdp(PingOneClientInfo), + ignoredErrors: nil, + }, { name: "Resource", resource: resources.Resource(PingOneClientInfo), diff --git a/internal/connector/pingone/sso/resources/pingone_application_secret_test.go b/internal/connector/pingone/sso/resources/pingone_application_secret_test.go index 73413b46..4baec63b 100644 --- a/internal/connector/pingone/sso/resources/pingone_application_secret_test.go +++ b/internal/connector/pingone/sso/resources/pingone_application_secret_test.go @@ -46,6 +46,11 @@ func TestApplicationSecretExport(t *testing.T) { ResourceName: "Test MFA_secret", ResourceID: fmt.Sprintf("%s/11cfc8c7-ec0c-43ff-b49a-64f5e243f932", testutils.GetEnvironmentID()), }, + { + ResourceType: "pingone_application_secret", + ResourceName: "Worker App_secret", + ResourceID: fmt.Sprintf("%s/c45c2f8c-dee0-4a12-b169-bae693a13d57", testutils.GetEnvironmentID()), + }, } testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) diff --git a/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute_test.go b/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute_test.go index a989b488..61aba367 100644 --- a/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute_test.go +++ b/internal/connector/pingone/sso/resources/pingone_identity_provider_attribute_test.go @@ -18,7 +18,7 @@ func TestIdentityProviderAttributeExport(t *testing.T) { expectedImportBlocks := []connector.ImportBlock{ { ResourceType: "pingone_identity_provider_attribute", - ResourceName: "Test IdP_username", + ResourceName: "Default Idp Test_username", ResourceID: fmt.Sprintf("%s/a99df558-7090-4303-8f35-860ac660e371/51a036c6-41ed-44f7-bd1d-eacaa2a1feab", testutils.GetEnvironmentID()), }, } diff --git a/internal/connector/pingone/sso/resources/pingone_identity_provider_test.go b/internal/connector/pingone/sso/resources/pingone_identity_provider_test.go index 73b023f4..8cc66e23 100644 --- a/internal/connector/pingone/sso/resources/pingone_identity_provider_test.go +++ b/internal/connector/pingone/sso/resources/pingone_identity_provider_test.go @@ -18,7 +18,7 @@ func TestIdentityProviderExport(t *testing.T) { expectedImportBlocks := []connector.ImportBlock{ { ResourceType: "pingone_identity_provider", - ResourceName: "Test IdP", + ResourceName: "Default Idp Test", ResourceID: fmt.Sprintf("%s/a99df558-7090-4303-8f35-860ac660e371", testutils.GetEnvironmentID()), }, } diff --git a/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider.go b/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider.go new file mode 100644 index 00000000..e70b5f4a --- /dev/null +++ b/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider.go @@ -0,0 +1,97 @@ +package resources + +import ( + "fmt" + + "github.com/patrickcping/pingone-go-sdk-v2/management" + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/common" + "github.com/pingidentity/pingcli/internal/connector/pingone" + "github.com/pingidentity/pingcli/internal/logger" +) + +// Verify that the resource satisfies the exportable resource interface +var ( + _ connector.ExportableResource = &PingOnePopulationDefaultIdpResource{} +) + +type PingOnePopulationDefaultIdpResource struct { + clientInfo *connector.PingOneClientInfo +} + +// Utility method for creating a PingOnePopulationDefaultIdpResource +func PopulationDefaultIdp(clientInfo *connector.PingOneClientInfo) *PingOnePopulationDefaultIdpResource { + return &PingOnePopulationDefaultIdpResource{ + clientInfo: clientInfo, + } +} + +func (r *PingOnePopulationDefaultIdpResource) ResourceType() string { + return "pingone_population_default_identity_provider" +} + +func (r *PingOnePopulationDefaultIdpResource) ExportAll() (*[]connector.ImportBlock, error) { + l := logger.Get() + l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType()) + + importBlocks := []connector.ImportBlock{} + + populationData, err := r.getPopulationData() + if err != nil { + return nil, err + } + + for populationId, populationName := range populationData { + ok, err := r.checkPopulationDefaultIdp(populationId) + if err != nil { + return nil, err + } + if !ok { + return &importBlocks, nil + } + + commentData := map[string]string{ + "Export Environment ID": r.clientInfo.ExportEnvironmentID, + "Population ID": populationId, + "Population Name": populationName, + "Resource Type": r.ResourceType(), + } + + importBlock := connector.ImportBlock{ + ResourceType: r.ResourceType(), + ResourceName: fmt.Sprintf("%s_default_identity_provider", populationName), + ResourceID: fmt.Sprintf("%s/%s", r.clientInfo.ExportEnvironmentID, populationId), + CommentInformation: common.GenerateCommentInformation(commentData), + } + + importBlocks = append(importBlocks, importBlock) + } + + return &importBlocks, nil +} + +func (r *PingOnePopulationDefaultIdpResource) getPopulationData() (map[string]string, error) { + populationData := make(map[string]string) + + iter := r.clientInfo.ApiClient.ManagementAPIClient.PopulationsApi.ReadAllPopulations(r.clientInfo.Context, r.clientInfo.ExportEnvironmentID).Execute() + populations, err := pingone.GetManagementAPIObjectsFromIterator[management.Population](iter, "ReadAllPopulations", "GetPopulations", r.ResourceType()) + if err != nil { + return nil, err + } + + for _, population := range populations { + populationId, populationIdOk := population.GetIdOk() + populationName, populationNameOk := population.GetNameOk() + + if populationIdOk && populationNameOk { + populationData[*populationId] = *populationName + } + } + + return populationData, nil +} + +func (r *PingOnePopulationDefaultIdpResource) checkPopulationDefaultIdp(populationId string) (bool, error) { + _, resp, err := r.clientInfo.ApiClient.ManagementAPIClient.PopulationsApi.ReadOnePopulationDefaultIdp(r.clientInfo.Context, r.clientInfo.ExportEnvironmentID, populationId).Execute() + return pingone.CheckSingletonResource(resp, err, "ReadOnePopulationDefaultIdp", r.ResourceType()) +} diff --git a/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider_test.go b/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider_test.go new file mode 100644 index 00000000..4f1aaea4 --- /dev/null +++ b/internal/connector/pingone/sso/resources/pingone_population_default_identity_provider_test.go @@ -0,0 +1,37 @@ +package resources_test + +import ( + "fmt" + "testing" + + "github.com/pingidentity/pingcli/internal/connector" + "github.com/pingidentity/pingcli/internal/connector/pingone/sso/resources" + "github.com/pingidentity/pingcli/internal/testing/testutils" +) + +func TestPopulationDefaultIdpExport(t *testing.T) { + // Get initialized apiClient and resource + PingOneClientInfo := testutils.GetPingOneClientInfo(t) + resource := resources.PopulationDefaultIdp(PingOneClientInfo) + + // Defined the expected ImportBlocks for the resource + expectedImportBlocks := []connector.ImportBlock{ + { + ResourceType: "pingone_population_default_identity_provider", + ResourceName: "Default_default_identity_provider", + ResourceID: fmt.Sprintf("%s/720da2ce-4dd0-48d9-af75-aeadbda1860d", testutils.GetEnvironmentID()), + }, + { + ResourceType: "pingone_population_default_identity_provider", + ResourceName: "LDAP Gateway Population_default_identity_provider", + ResourceID: fmt.Sprintf("%s/374fdb3c-4e94-4547-838a-0c200b9a7c70", testutils.GetEnvironmentID()), + }, + { + ResourceType: "pingone_population_default_identity_provider", + ResourceName: "Test Default Idp Population_default_identity_provider", + ResourceID: fmt.Sprintf("%s/2814912d-4a0f-4104-a779-80c13b2a6dcd", testutils.GetEnvironmentID()), + }, + } + + testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks) +} diff --git a/internal/connector/pingone/sso/resources/pingone_population_test.go b/internal/connector/pingone/sso/resources/pingone_population_test.go index 384f2010..2c445d51 100644 --- a/internal/connector/pingone/sso/resources/pingone_population_test.go +++ b/internal/connector/pingone/sso/resources/pingone_population_test.go @@ -26,6 +26,11 @@ func TestPopulationExport(t *testing.T) { ResourceName: "LDAP Gateway Population", ResourceID: fmt.Sprintf("%s/374fdb3c-4e94-4547-838a-0c200b9a7c70", testutils.GetEnvironmentID()), }, + { + ResourceType: "pingone_population", + ResourceName: "Test Default Idp Population", + ResourceID: fmt.Sprintf("%s/2814912d-4a0f-4104-a779-80c13b2a6dcd", testutils.GetEnvironmentID()), + }, } testutils.ValidateImportBlocks(t, resource, &expectedImportBlocks)