in types/azurerm_resource.go [60:123]
func (r *AzurermResource) GenerateNewConfig(terraform *tf.Terraform) error {
if !r.IsMultipleResources() {
instance := r.Instances[0]
log.Printf("[INFO] importing %s to %s and generating config...", instance.ResourceId, r.NewAddress(nil))
block, err := importAndGenerateConfig(terraform, r.NewAddress(nil), instance.ResourceId, "", true)
if err != nil {
return err
}
r.Block = block
valuePropMap := GetValuePropMap(r.Block, r.NewAddress(nil))
for i, output := range r.Instances[0].Outputs {
r.Instances[0].Outputs[i].NewName = valuePropMap[output.GetStringValue()]
}
r.Migrated = true
log.Printf("[INFO] resource %s has migrated to %s", r.OldAddress(nil), r.NewAddress(nil))
r.Block = InjectReference(r.Block, r.References)
} else {
// import and build combined block
log.Printf("[INFO] generating config...")
blocks := make([]*hclwrite.Block, 0)
for _, instance := range r.Instances {
instanceAddress := fmt.Sprintf("%s.%s_%v", r.NewResourceType, r.NewLabel, strings.ReplaceAll(fmt.Sprintf("%v", instance.Index), "/", "_"))
if block, err := importAndGenerateConfig(terraform, instanceAddress, instance.ResourceId, "", true); err == nil {
blocks = append(blocks, block)
}
}
combinedBlock := hclwrite.NewBlock("resource", []string{r.NewResourceType, r.NewLabel})
if r.IsForEach() {
foreachItems := CombineBlock(blocks, combinedBlock, true)
foreachConfig := GetForEachConstants(r.Instances, foreachItems)
combinedBlock.Body().SetAttributeRaw("for_each", helper.GetTokensForExpression(foreachConfig))
} else {
_ = CombineBlock(blocks, combinedBlock, false)
combinedBlock.Body().SetAttributeRaw("count", helper.GetTokensForExpression(fmt.Sprintf("%d", len(r.Instances))))
}
r.Block = combinedBlock
for i, instance := range r.Instances {
valuePropMap := GetValuePropMap(blocks[i], r.NewAddress(instance.Index))
for j, output := range r.Instances[i].Outputs {
r.Instances[i].Outputs[j].NewName = valuePropMap[output.GetStringValue()]
}
}
for i, instance := range r.Instances {
// TODO: improve this, azapi resource should use .output.xxx to access the output properties
r.Instances[i].Outputs = append(r.Instances[i].Outputs, Output{
OldName: r.OldAddress(instance.Index),
NewName: r.NewAddress(instance.Index),
})
props := []string{"location", "tags", "identity", "identity.0", "identity.0.type", "identity.0.identity_ids", "id"}
for _, prop := range props {
r.Instances[i].Outputs = append(r.Instances[i].Outputs, Output{
OldName: r.OldAddress(instance.Index) + "." + prop,
NewName: r.NewAddress(instance.Index) + "." + prop,
})
}
}
r.Block = InjectReference(r.Block, r.References)
}
r.Block = sortAttributes(r.Block)
r.Migrated = true
return nil
}