Skip to content

Commit 64d1f79

Browse files
authored
Fix BCP Exporter Dependencies and Add Deterministic Output (#2187)
* Fix BCP exporter so that the name output is correct, and flows export dependencies correctly * Sort BCP exporter output for deterministic and reproducable output * Fix a few bugs in the dependent_consumers package and ensure output is sorted * Fix tests * Break out make sideload-only as a separate command for better build handling with BCP * PR feedback
1 parent e408e99 commit 64d1f79

11 files changed

+865
-101
lines changed

GNUmakefile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ build:
7171
GOOS = $(shell go env GOOS)
7272
GOARCH = $(shell go env GOARCH)
7373

74-
sideload: build
74+
sideload-only:
7575
mkdir -p ${PLUGINS_DIR}/${PLUGIN_PATH}/${DEV_VERSION}/$(GOOS)_$(GOARCH)
7676
cp ${BIN_PATH} ${PLUGINS_DIR}/${PLUGIN_PATH}/${DEV_VERSION}/$(GOOS)_$(GOARCH)/${BIN_NAME}
7777

78+
sideload: build sideload-only
79+
7880
generate-dependencyTree:
79-
go run ./tools/dependency_tree "public/data/" $(version)
81+
go run ./tools/dependency_tree "public/data/" $(version)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package bcp_tf_exporter
2+
3+
import (
4+
"sync"
5+
"testing"
6+
7+
"github.com/mypurecloud/terraform-provider-genesyscloud/genesyscloud/architect_flow"
8+
"github.com/mypurecloud/terraform-provider-genesyscloud/genesyscloud/group"
9+
"github.com/mypurecloud/terraform-provider-genesyscloud/genesyscloud/user"
10+
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
)
13+
14+
/*
15+
The genesyscloud_bcp_tf_exporter_init_test.go file is used to initialize the resources
16+
used in testing the bcp_tf_exporter resource.
17+
*/
18+
19+
type registerTestInstance struct {
20+
resourceMapMutex sync.RWMutex
21+
}
22+
23+
// registerTestResources registers all resources used in the tests
24+
func (r *registerTestInstance) registerTestResources() {
25+
r.resourceMapMutex.Lock()
26+
defer r.resourceMapMutex.Unlock()
27+
28+
providerResources[ResourceType] = ResourceBcpTfExporter()
29+
providerResources[user.ResourceType] = user.ResourceUser()
30+
providerResources[group.ResourceType] = group.ResourceGroup()
31+
providerResources[architect_flow.ResourceType] = architect_flow.ResourceArchitectFlow()
32+
}
33+
34+
// initTestResources initializes all test resources and data sources.
35+
func initTestResources() {
36+
providerResources = make(map[string]*schema.Resource)
37+
38+
regInstance := &registerTestInstance{}
39+
40+
regInstance.registerTestResources()
41+
42+
}
43+
44+
// TestMain is a "setup" function called by the testing framework when run the test
45+
func TestMain(m *testing.M) {
46+
// Run setup function before starting the test suite for the auth_role package
47+
initTestResources()
48+
49+
// Run the test suite for the auth_role package
50+
m.Run()
51+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package bcp_tf_exporter
2+
3+
import (
4+
"context"
5+
6+
dependentconsumers "github.com/mypurecloud/terraform-provider-genesyscloud/genesyscloud/dependent_consumers"
7+
"github.com/mypurecloud/terraform-provider-genesyscloud/genesyscloud/provider"
8+
resourceExporter "github.com/mypurecloud/terraform-provider-genesyscloud/genesyscloud/resource_exporter"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11+
"github.com/mypurecloud/platform-client-sdk-go/v179/platformclientv2"
12+
)
13+
14+
type BcpExporterProxy struct {
15+
ClientConfig *platformclientv2.Configuration
16+
GetFlowDependenciesAttr getFlowDependenciesFunc
17+
GetAllWithPooledClientAttr getPooledClientFunc
18+
}
19+
20+
type getFlowDependenciesFunc func(ctx context.Context, p *BcpExporterProxy, resourceInfo resourceExporter.ResourceInfo) (resourceExporter.ResourceIDMetaMap, *resourceExporter.DependencyResource, error)
21+
type getPooledClientFunc func(ctx context.Context, method provider.GetCustomConfigFunc) (resourceExporter.ResourceIDMetaMap, *resourceExporter.DependencyResource, []string, diag.Diagnostics)
22+
23+
var InternalProxy *BcpExporterProxy
24+
25+
func GetBcpExporterProxy(ClientConfig *platformclientv2.Configuration) *BcpExporterProxy {
26+
return newBcpExporterProxy(ClientConfig)
27+
}
28+
29+
func newBcpExporterProxy(ClientConfig *platformclientv2.Configuration) *BcpExporterProxy {
30+
if InternalProxy == nil {
31+
InternalProxy = &BcpExporterProxy{
32+
GetAllWithPooledClientAttr: getPooledClientFn,
33+
}
34+
}
35+
36+
if ClientConfig != nil {
37+
InternalProxy.ClientConfig = ClientConfig
38+
InternalProxy.GetFlowDependenciesAttr = getFlowDependenciesFn
39+
}
40+
return InternalProxy
41+
}
42+
43+
func (p *BcpExporterProxy) GetFlowDependencies(ctx context.Context, resourceInfo resourceExporter.ResourceInfo) (resourceExporter.ResourceIDMetaMap, *resourceExporter.DependencyResource, error) {
44+
return p.GetFlowDependenciesAttr(ctx, p, resourceInfo)
45+
}
46+
47+
func (p *BcpExporterProxy) GetAllWithPooledClient(ctx context.Context, method provider.GetCustomConfigFunc) (resourceExporter.ResourceIDMetaMap, *resourceExporter.DependencyResource, []string, diag.Diagnostics) {
48+
return p.GetAllWithPooledClientAttr(ctx, method)
49+
}
50+
51+
func getPooledClientFn(ctx context.Context, method provider.GetCustomConfigFunc) (resourceExporter.ResourceIDMetaMap, *resourceExporter.DependencyResource, []string, diag.Diagnostics) {
52+
resourceFunc := provider.GetAllWithPooledClientCustom(method)
53+
// Pass the context through - don't replace it
54+
resources, dependsMap, totalFlowResources, err := resourceFunc(ctx)
55+
if err != nil {
56+
return nil, nil, totalFlowResources, err
57+
}
58+
return resources, dependsMap, totalFlowResources, err
59+
}
60+
61+
func getFlowDependenciesFn(ctx context.Context, p *BcpExporterProxy, resourceInfo resourceExporter.ResourceInfo) (resourceExporter.ResourceIDMetaMap, *resourceExporter.DependencyResource, error) {
62+
// Create fresh config to avoid pooled client's canceled context issue
63+
// Only copy essential auth settings for efficiency
64+
freshConfig := platformclientv2.NewConfiguration()
65+
freshConfig.BasePath = p.ClientConfig.BasePath
66+
freshConfig.AccessToken = p.ClientConfig.AccessToken
67+
freshConfig.DefaultHeader = p.ClientConfig.DefaultHeader // Direct assignment is safe for read-only use
68+
69+
depConsumerProxy := dependentconsumers.GetDependentConsumerProxy(freshConfig)
70+
resources, dependsMap, _, err := depConsumerProxy.GetDependentConsumers(ctx, resourceInfo, []string{})
71+
if err != nil {
72+
return nil, nil, err
73+
}
74+
return resources, dependsMap, nil
75+
}

0 commit comments

Comments
 (0)