@@ -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}
0 commit comments