diff --git a/google/services/resourcemanager/list_google_service_account.go b/google/services/resourcemanager/list_google_service_account.go index e228c7a39b4..7d469aa8d12 100644 --- a/google/services/resourcemanager/list_google_service_account.go +++ b/google/services/resourcemanager/list_google_service_account.go @@ -141,6 +141,7 @@ func ListServiceAccounts(config *transport_tpg.Config, project string, callback return transport_tpg.ListPages(transport_tpg.ListPagesOptions{ Config: config, TempData: d, + Resource: ResourceGoogleServiceAccount(), ListURL: url, BillingProject: billingProject, UserAgent: userAgent, diff --git a/google/transport/transport.go b/google/transport/transport.go index 6c59a87a208..c47d6fb74c2 100644 --- a/google/transport/transport.go +++ b/google/transport/transport.go @@ -325,6 +325,7 @@ func IsApiNotEnabledError(err error) bool { type ListPagesOptions struct { Config *Config TempData *schema.ResourceData + Resource *schema.Resource ListURL string BillingProject string UserAgent string @@ -373,18 +374,20 @@ func ListPages(opt ListPagesOptions) error { items, ok = res["items"].([]interface{}) } if ok { + // Capture the seed state once per page. State() returns a snapshot, so reads + // here are unaffected by anything the flattener writes on prior iterations. + seedState := opt.TempData.State() for _, item := range items { itemMap, ok := item.(map[string]interface{}) if !ok { return fmt.Errorf("expected item to be map[string]interface{}, got %T", item) } - err = opt.Flattener(itemMap, opt.TempData, opt.Config) - if err != nil { + itemResourceData := opt.Resource.Data(seedState) + if err := opt.Flattener(itemMap, itemResourceData, opt.Config); err != nil { return fmt.Errorf("Error flattening instance: %s", err) } - err = opt.Callback(opt.TempData) - if err != nil { + if err := opt.Callback(itemResourceData); err != nil { return err } }