Skip to content

Commit b7d19ba

Browse files
committed
feat(export): add management-zone scoped export
1 parent 2fab186 commit b7d19ba

File tree

4 files changed

+119
-19
lines changed

4 files changed

+119
-19
lines changed

dynatrace/export/environment.go

Lines changed: 60 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/api/v2/entity"
3939
entitysettings "github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/api/v2/entity/settings"
4040
"github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/rest"
41+
"github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/settings"
4142
"github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/settings/services/cache"
4243
"github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/shutdown"
4344
"github.com/dynatrace-oss/terraform-provider-dynatrace/provider/logging"
@@ -56,19 +57,22 @@ var JSON_DASHBOARD_BASE_PLUS = true
5657
const ENV_VAR_CUSTOM_PROVIDER_LOCATION = "DYNATRACE_CUSTOM_PROVIDER_LOCATION"
5758

5859
type Environment struct {
59-
mu sync.Mutex
60-
OutputFolder string
61-
Credentials *rest.Credentials
62-
Modules map[ResourceType]*Module
63-
Flags Flags
64-
ResArgs map[string][]string
65-
ChildResourceOverride bool
66-
PrevStateMapCommon *StateMap
67-
PrevNamesByModule map[string][]string
68-
ImportStateMap *StateMap
69-
ChildParentGroups map[ResourceType]ResourceType
70-
IsParentMap map[ResourceType]bool
71-
HasDependenciesTo map[ResourceType]bool
60+
mu sync.Mutex
61+
OutputFolder string
62+
Credentials *rest.Credentials
63+
Modules map[ResourceType]*Module
64+
Flags Flags
65+
ResArgs map[string][]string
66+
ChildResourceOverride bool
67+
PrevStateMapCommon *StateMap
68+
PrevNamesByModule map[string][]string
69+
ImportStateMap *StateMap
70+
ChildParentGroups map[ResourceType]ResourceType
71+
IsParentMap map[ResourceType]bool
72+
HasDependenciesTo map[ResourceType]bool
73+
ManagementZoneName string
74+
ManagementZoneID string
75+
ManagementZoneLegacyID string
7276
}
7377

7478
func (me *Environment) TenantID() string {
@@ -490,6 +494,49 @@ func (me *Environment) PostProcess() error {
490494
return nil
491495
}
492496

497+
func (me *Environment) HasManagementZoneFilter() bool {
498+
return strings.TrimSpace(me.ManagementZoneName) != ""
499+
}
500+
501+
func (me *Environment) managementZoneMatch(text string) bool {
502+
if len(text) == 0 {
503+
return false
504+
}
505+
if len(me.ManagementZoneID) > 0 && strings.Contains(text, me.ManagementZoneID) {
506+
return true
507+
}
508+
if len(me.ManagementZoneLegacyID) > 0 && strings.Contains(text, me.ManagementZoneLegacyID) {
509+
return true
510+
}
511+
if len(me.ManagementZoneName) > 0 && strings.Contains(text, me.ManagementZoneName) {
512+
return true
513+
}
514+
return false
515+
}
516+
517+
func (me *Environment) ResourceMatchesManagementZone(res *Resource, value settings.Settings) bool {
518+
if !me.HasManagementZoneFilter() {
519+
return true
520+
}
521+
522+
if res != nil && (res.Type == ResourceTypes.ManagementZoneV2 || res.Type == ResourceTypes.ManagementZone) {
523+
return strings.EqualFold(res.Name, me.ManagementZoneName)
524+
}
525+
526+
if value != nil {
527+
if me.managementZoneMatch(settings.GetScope(value)) {
528+
return true
529+
}
530+
if payload, err := json.Marshal(value); err == nil {
531+
if me.managementZoneMatch(string(payload)) {
532+
return true
533+
}
534+
}
535+
}
536+
537+
return false
538+
}
539+
493540
func voidResource(resource *Resource) error {
494541
if resource == nil {
495542
return nil

dynatrace/export/initialize.go

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"os"
2626
"strings"
2727

28+
v2managementzones "github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/api/builtin/managementzones"
2829
"github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/rest"
2930
"github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/settings"
3031
"github.com/dynatrace-oss/terraform-provider-dynatrace/dynatrace/settings/services/cache"
@@ -190,6 +191,14 @@ func Initialize(cfgGetter config.Getter) (environment *Environment, err error) {
190191
return nil, err
191192
}
192193

194+
var managementZoneID string
195+
var managementZoneLegacyID string
196+
if len(flags.ManagementZone) > 0 {
197+
if managementZoneID, managementZoneLegacyID, err = resolveManagementZone(context.Background(), credentials, flags.ManagementZone); err != nil {
198+
return nil, err
199+
}
200+
}
201+
193202
// If ONLY child resources are getting exported we
194203
// don't treat them as such. Request from Omar Zaal
195204
requestingOnlyChildResources := true
@@ -205,12 +214,15 @@ func Initialize(cfgGetter config.Getter) (environment *Environment, err error) {
205214
}
206215

207216
return &Environment{
208-
OutputFolder: targetFolder,
209-
Credentials: credentials,
210-
Modules: map[ResourceType]*Module{},
211-
Flags: flags,
212-
ResArgs: resArgs,
213-
ChildResourceOverride: requestingOnlyChildResources,
217+
OutputFolder: targetFolder,
218+
Credentials: credentials,
219+
Modules: map[ResourceType]*Module{},
220+
Flags: flags,
221+
ResArgs: resArgs,
222+
ChildResourceOverride: requestingOnlyChildResources,
223+
ManagementZoneName: flags.ManagementZone,
224+
ManagementZoneID: managementZoneID,
225+
ManagementZoneLegacyID: managementZoneLegacyID,
214226
}, nil
215227
}
216228

@@ -228,6 +240,7 @@ func createFlags() (flags Flags, tailArgs []string) {
228240
importState := flag.Bool("import-state", false, "automatically initialize the terraform module and import downloaded resources to the state")
229241
exclude := flag.Bool("exclude", false, "exclude specified resources")
230242
skipTerraformInit := flag.Bool("skip-terraform-init", false, "prevent the command line `terraform init` from getting executed after all the configuration files have been created")
243+
managementZone := flag.String("management-zone", "", "export only resources scoped to the specified management zone name")
231244

232245
flag.Parse()
233246

@@ -245,6 +258,7 @@ func createFlags() (flags Flags, tailArgs []string) {
245258
Exclude: *exclude,
246259
DataSources: *dataSourceArg,
247260
SkipTerraformInit: *skipTerraformInit,
261+
ManagementZone: strings.TrimSpace(*managementZone),
248262
}, flag.Args()
249263
}
250264

@@ -299,4 +313,33 @@ type Flags struct {
299313
DataSources bool
300314
SkipTerraformInit bool
301315
Include bool
316+
ManagementZone string
317+
}
318+
319+
func resolveManagementZone(ctx context.Context, credentials *rest.Credentials, name string) (string, string, error) {
320+
name = strings.TrimSpace(name)
321+
if len(name) == 0 {
322+
return "", "", fmt.Errorf("management zone name must not be empty")
323+
}
324+
325+
service := v2managementzones.Service(credentials)
326+
stubs, err := service.List(ctx)
327+
if err != nil {
328+
return "", "", err
329+
}
330+
331+
for _, stub := range stubs {
332+
if stub == nil {
333+
continue
334+
}
335+
if strings.EqualFold(stub.Name, name) {
336+
legacy := ""
337+
if stub.LegacyID != nil {
338+
legacy = *stub.LegacyID
339+
}
340+
return stub.ID, legacy, nil
341+
}
342+
}
343+
344+
return "", "", fmt.Errorf("management zone %q not found", name)
302345
}

dynatrace/export/module.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,6 +1342,11 @@ func (me *Module) Discover() error {
13421342
fmt.Printf("Ignoring Resource - Type: %s - ID: %s\n", me.Type, stub.ID)
13431343
continue
13441344
}
1345+
if me.Environment.HasManagementZoneFilter() && (me.Type == ResourceTypes.ManagementZoneV2 || me.Type == ResourceTypes.ManagementZone) {
1346+
if !strings.EqualFold(stub.Name, me.Environment.ManagementZoneName) {
1347+
continue
1348+
}
1349+
}
13451350
if IsIgnoredResource(me.Type, stub.ID) {
13461351
fmt.Printf("Ignoring Resource - Type: %s - ID: %s\n", me.Type, stub.ID)
13471352
continue

dynatrace/export/resource.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,11 @@ func (me *Resource) Download() error {
318318
name := settings.Name(settngs, me.ID)
319319
me.SetName(name)
320320

321+
if me.Module.Environment.HasManagementZoneFilter() && !me.Module.Environment.ResourceMatchesManagementZone(me, settngs) {
322+
me.SetStatus(ResourceStati.Excluded)
323+
return nil
324+
}
325+
321326
legacyID := settings.GetLegacyID(settngs)
322327
if legacyID != nil {
323328
me.LegacyID = *legacyID

0 commit comments

Comments
 (0)