Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
728440e
begin draft for `authorize` service Terraform export
patrickcping Oct 8, 2024
ef7b359
development updates
patrickcping Oct 10, 2024
b5b0357
full authorize draft (pre-testing)
patrickcping Oct 11, 2024
fef7b68
Merge branch 'main' into add-pingone-authorize-export-202410
patrickcping Oct 15, 2024
64ae319
update imports
patrickcping Oct 15, 2024
0537447
Merge branch 'main' into add-pingone-authorize-export-202410
patrickcping Nov 7, 2024
512695f
add authorize to available exportable services
patrickcping Nov 7, 2024
ac7f66d
change name to full name, filter on managed entity
patrickcping Nov 7, 2024
59ff819
Merge branch 'main' into add-pingone-authorize-export-202410
patrickcping Nov 25, 2024
821e9d2
Merge branch 'main' into add-pingone-authorize-export-202410
patrickcping Feb 26, 2025
506994e
update authorize for EA
patrickcping Feb 26, 2025
1432fca
Remove unreleased authorize editor resources
patrickcping Feb 26, 2025
7e649eb
Revert go.mod to standard
patrickcping Feb 26, 2025
846ac30
add `pingone_application_resource_permission`
patrickcping Feb 26, 2025
a91fdf5
fix lint and extract issues
patrickcping Feb 26, 2025
1c6a0c2
add `pingone_application_resource` resource
patrickcping Feb 27, 2025
9f2a6a6
update test cases
patrickcping Feb 27, 2025
a010f4e
testing test
patrickcping Feb 27, 2025
d0ef5da
update tests
patrickcping Feb 27, 2025
0d3addb
update role permissions resource name
patrickcping Feb 28, 2025
78f8e3c
refactor application_resource
patrickcping Feb 28, 2025
bb3fba4
clarify PingOne resource
patrickcping Feb 28, 2025
c4523b2
update test
patrickcping Feb 28, 2025
2dd5978
remove keys
patrickcping Feb 28, 2025
6c50801
correct test
patrickcping Feb 28, 2025
38beb41
update test
patrickcping Feb 28, 2025
b6d337a
update keying
patrickcping Feb 28, 2025
4da6403
correct lint
patrickcping Feb 28, 2025
87fe2e7
add back api service deployment
patrickcping Feb 28, 2025
6991a8c
add tests for undeployed api service
patrickcping Feb 28, 2025
4552d94
add missing attribute test
patrickcping Feb 28, 2025
30f7610
correct resource ID in test
patrickcping Feb 28, 2025
7b9fd51
uncomment test
patrickcping Mar 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ go.work
go.work.sum
export
vendor
env*.sh
env*.sh
.env
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ require (
github.com/hashicorp/go-uuid v1.0.3
github.com/manifoldco/promptui v0.9.0
github.com/patrickcping/pingone-go-sdk-v2 v0.12.9
github.com/patrickcping/pingone-go-sdk-v2/authorize v0.8.0
github.com/patrickcping/pingone-go-sdk-v2/management v0.49.0
github.com/patrickcping/pingone-go-sdk-v2/mfa v0.23.0
github.com/patrickcping/pingone-go-sdk-v2/risk v0.19.0
Expand Down Expand Up @@ -137,7 +138,6 @@ require (
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.19.0 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/patrickcping/pingone-go-sdk-v2/authorize v0.8.0 // indirect
github.com/patrickcping/pingone-go-sdk-v2/credentials v0.11.0 // indirect
github.com/patrickcping/pingone-go-sdk-v2/verify v0.9.0 // indirect
github.com/pavius/impi v0.0.3 // indirect
Expand Down
3 changes: 3 additions & 0 deletions internal/commands/platform/export_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/pingidentity/pingcli/internal/connector"
"github.com/pingidentity/pingcli/internal/connector/common"
"github.com/pingidentity/pingcli/internal/connector/pingfederate"
"github.com/pingidentity/pingcli/internal/connector/pingone/authorize"
"github.com/pingidentity/pingcli/internal/connector/pingone/mfa"
"github.com/pingidentity/pingcli/internal/connector/pingone/platform"
"github.com/pingidentity/pingcli/internal/connector/pingone/protect"
Expand Down Expand Up @@ -464,6 +465,8 @@ func getExportableConnectors(exportServices *customtypes.ExportServices) (export
switch service {
case customtypes.ENUM_EXPORT_SERVICE_PINGONE_PLATFORM:
connectors = append(connectors, platform.PlatformConnector(pingoneContext, pingoneApiClient, &pingoneApiClientId, pingoneExportEnvID))
case customtypes.ENUM_EXPORT_SERVICE_PINGONE_AUTHORIZE:
connectors = append(connectors, authorize.AuthorizeConnector(pingoneContext, pingoneApiClient, &pingoneApiClientId, pingoneExportEnvID))
case customtypes.ENUM_EXPORT_SERVICE_PINGONE_SSO:
connectors = append(connectors, sso.SSOConnector(pingoneContext, pingoneApiClient, &pingoneApiClientId, pingoneExportEnvID))
case customtypes.ENUM_EXPORT_SERVICE_PINGONE_MFA:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package authorize

import (
"context"

pingoneGoClient "github.com/patrickcping/pingone-go-sdk-v2/pingone"
"github.com/pingidentity/pingcli/internal/connector"
"github.com/pingidentity/pingcli/internal/connector/common"
"github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources"
"github.com/pingidentity/pingcli/internal/logger"
)

const (
serviceName = "pingone-authorize"
)

// Verify that the connector satisfies the expected interfaces
var (
_ connector.Exportable = &PingoneAuthorizeConnector{}
_ connector.Authenticatable = &PingoneAuthorizeConnector{}
)

type PingoneAuthorizeConnector struct {
clientInfo connector.PingOneClientInfo
}

// Utility method for creating a PingoneAuthorizeConnector
func AuthorizeConnector(ctx context.Context, apiClient *pingoneGoClient.Client, apiClientId *string, exportEnvironmentID string) *PingoneAuthorizeConnector {
return &PingoneAuthorizeConnector{
clientInfo: connector.PingOneClientInfo{
Context: ctx,
ApiClient: apiClient,
ApiClientId: apiClientId,
ExportEnvironmentID: exportEnvironmentID,
},
}
}

func (c *PingoneAuthorizeConnector) Export(format, outputDir string, overwriteExport bool) error {
l := logger.Get()

l.Debug().Msgf("Exporting all PingOne Authorize Resources...")

exportableResources := []connector.ExportableResource{
resources.AuthorizeAPIService(&c.clientInfo),
resources.AuthorizeAPIServiceDeployment(&c.clientInfo),
resources.AuthorizeAPIServiceOperation(&c.clientInfo),
resources.ApplicationResource(&c.clientInfo),
resources.AuthorizeApplicationResourcePermission(&c.clientInfo),
resources.AuthorizeApplicationRole(&c.clientInfo),
resources.AuthorizeApplicationRolePermission(&c.clientInfo),
resources.AuthorizeDecisionEndpoint(&c.clientInfo),
}

return common.WriteFiles(exportableResources, format, outputDir, overwriteExport)
}

func (c *PingoneAuthorizeConnector) ConnectorServiceName() string {
return serviceName
}

func (c *PingoneAuthorizeConnector) Login() error {
return nil
}

func (c *PingoneAuthorizeConnector) Logout() error {
return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package authorize_test

import (
"testing"

"github.com/pingidentity/pingcli/internal/connector"
"github.com/pingidentity/pingcli/internal/connector/pingone/authorize/resources"
"github.com/pingidentity/pingcli/internal/testing/testutils"
"github.com/pingidentity/pingcli/internal/testing/testutils_terraform"
)

func TestAuthorizeTerraformPlan(t *testing.T) {
PingOneClientInfo := testutils.GetPingOneClientInfo(t)

testutils_terraform.InitPingOneTerraform(t)

testCases := []struct {
name string
resource connector.ExportableResource
ignoredErrors []string
}{
{
name: "AuthorizeAPIService",
resource: resources.AuthorizeAPIService(PingOneClientInfo),
ignoredErrors: nil,
},
{
name: "AuthorizeAPIServiceDeployment",
resource: resources.AuthorizeAPIServiceDeployment(PingOneClientInfo),
ignoredErrors: nil,
},
{
name: "AuthorizeAPIServiceOperation",
resource: resources.AuthorizeAPIServiceOperation(PingOneClientInfo),
ignoredErrors: nil,
},
{
name: "AuthorizeApplicationRole",
resource: resources.AuthorizeApplicationRole(PingOneClientInfo),
ignoredErrors: nil,
},
{
name: "AuthorizeApplicationRolePermission",
resource: resources.AuthorizeApplicationRolePermission(PingOneClientInfo),
ignoredErrors: nil,
},
{
name: "AuthorizeDecisionEndpoint",
resource: resources.AuthorizeDecisionEndpoint(PingOneClientInfo),
ignoredErrors: nil,
},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
testutils_terraform.ValidateTerraformPlan(t, tc.resource, tc.ignoredErrors)
})
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package resources

import (
"fmt"

"github.com/patrickcping/pingone-go-sdk-v2/authorize"
"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 = &PingOneApplicationResourceResource{}
)

type PingOneApplicationResourceResource struct {
clientInfo *connector.PingOneClientInfo
}

// Utility method for creating a PingOneApplicationResourceResource
func ApplicationResource(clientInfo *connector.PingOneClientInfo) *PingOneApplicationResourceResource {
return &PingOneApplicationResourceResource{
clientInfo: clientInfo,
}
}

func (r *PingOneApplicationResourceResource) ResourceType() string {
return "pingone_application_resource"
}

type applicationResourceObj struct {
applicationResourceName string
resourceId string
resourceName string
}

func (r *PingOneApplicationResourceResource) ExportAll() (*[]connector.ImportBlock, error) {
l := logger.Get()
l.Debug().Msgf("Exporting all '%s' Resources...", r.ResourceType())

importBlocks := []connector.ImportBlock{}

applicationResourceData, err := r.getApplicationResourceData()
if err != nil {
return nil, err
}

for applicationResourceId, applicationResourceObj := range applicationResourceData {
commentData := map[string]string{
"PingOne Resource ID": applicationResourceObj.resourceId,
"PingOne Resource Name": applicationResourceObj.resourceName,
"Application Resource ID": applicationResourceId,
"Application Resource Name": applicationResourceObj.applicationResourceName,
"Export Environment ID": r.clientInfo.ExportEnvironmentID,
"Resource Type": r.ResourceType(),
}

importBlock := connector.ImportBlock{
ResourceType: r.ResourceType(),
ResourceName: fmt.Sprintf("%s_%s", applicationResourceObj.resourceName, applicationResourceObj.applicationResourceName),
ResourceID: fmt.Sprintf("%s/%s/%s", r.clientInfo.ExportEnvironmentID, applicationResourceObj.resourceId, applicationResourceId),
CommentInformation: common.GenerateCommentInformation(commentData),
}

importBlocks = append(importBlocks, importBlock)
}

return &importBlocks, nil
}

func (r *PingOneApplicationResourceResource) getApplicationResourceData() (map[string]applicationResourceObj, error) {
applicationResourceData := make(map[string]applicationResourceObj)

iter := r.clientInfo.ApiClient.AuthorizeAPIClient.ApplicationResourcesApi.ReadApplicationResources(r.clientInfo.Context, r.clientInfo.ExportEnvironmentID).Execute()
applicationResources, err := pingone.GetAuthorizeAPIObjectsFromIterator[authorize.ApplicationResource](iter, "ReadApplicationResources", "GetResources", r.ResourceType())
if err != nil {
return nil, err
}

for _, applicationResource := range applicationResources {
applicationResourceId, applicationResourceIdOk := applicationResource.GetIdOk()
applicationResourceName, applicationResourceNameOk := applicationResource.GetNameOk()
resourceId, resourceIdOk := applicationResource.Parent.GetIdOk()

if applicationResourceIdOk && applicationResourceNameOk && resourceIdOk {

resourceObj, httpResponse, err := r.clientInfo.ApiClient.ManagementAPIClient.ResourcesApi.ReadOneResource(r.clientInfo.Context, r.clientInfo.ExportEnvironmentID, *resourceId).Execute()
ok, err := common.HandleClientResponse(httpResponse, err, "ReadOneResource", r.ResourceType())
if err != nil {
return nil, err
}
// A warning was given when handling the client response. Return nil apiObjects to skip export of resource
if !ok {
return nil, nil
}

applicationResourceData[*applicationResourceId] = applicationResourceObj{
applicationResourceName: *applicationResourceName,
resourceId: *resourceId,
resourceName: resourceObj.GetName(),
}
}
}

return applicationResourceData, nil
}
Loading
Loading