internal/meta/meta_res.go (119 lines of code) (raw):

package meta import ( "context" "fmt" "github.com/Azure/aztfexport/internal/resourceset" "github.com/Azure/aztfexport/internal/tfaddr" "github.com/Azure/aztfexport/pkg/config" "github.com/magodo/armid" "github.com/magodo/aztft/aztft" ) type MetaResource struct { baseMeta AzureIds []armid.ResourceId ResourceName string ResourceType string resourceNamePrefix string resourceNameSuffix string } func NewMetaResource(cfg config.Config) (*MetaResource, error) { cfg.Logger.Info("New resource meta") baseMeta, err := NewBaseMeta(cfg.CommonConfig) if err != nil { return nil, err } var ids []armid.ResourceId for _, id := range cfg.ResourceIds { id, err := armid.ParseResourceId(id) if err != nil { return nil, err } ids = append(ids, id) } meta := &MetaResource{ baseMeta: *baseMeta, AzureIds: ids, ResourceName: cfg.TFResourceName, ResourceType: cfg.TFResourceType, } meta.resourceNamePrefix, meta.resourceNameSuffix = resourceNamePattern(cfg.ResourceNamePattern) return meta, nil } func (meta MetaResource) ScopeName() string { if len(meta.AzureIds) == 1 { return meta.AzureIds[0].String() } else { return meta.AzureIds[0].String() + " and more..." } } func (meta *MetaResource) ListResource(ctx context.Context) (ImportList, error) { var resources []resourceset.AzureResource for _, id := range meta.AzureIds { resources = append(resources, resourceset.AzureResource{Id: id}) } rset := &resourceset.AzureResourceSet{ Resources: resources, } meta.Logger().Debug("Azure Resource set map to TF resource set") var rl []resourceset.TFResource if meta.useAzAPI() { rl = rset.ToTFAzAPIResources() } else { rl = rset.ToTFAzureRMResources(meta.Logger(), meta.parallelism, meta.azureSDKCred, meta.azureSDKClientOpt) } var l ImportList // The ResourceName and ResourceType are only honored for single resource if len(rl) == 1 { res := rl[0] // Honor the ResourceName name := meta.ResourceName if name == "" { name = fmt.Sprintf("%s%d%s", meta.resourceNamePrefix, 0, meta.resourceNameSuffix) } // Honor the ResourceType tftype := res.TFType tfid := res.TFId if meta.ResourceType != "" && meta.ResourceType != res.TFType { // res.TFType can be either empty (if aztft failed to query), or not. // If the user has specified a different type, then use it. tftype = meta.ResourceType // Also use this resource type to requery its resource id. var err error tfid, err = aztft.QueryId(res.AzureId.String(), meta.ResourceType, &aztft.APIOption{ Cred: meta.azureSDKCred, ClientOption: meta.azureSDKClientOpt, }) if err != nil { return nil, err } } tfAddr := tfaddr.TFAddr{ Type: tftype, Name: name, } item := ImportItem{ AzureResourceID: res.AzureId, TFResourceId: tfid, TFAddr: tfAddr, TFAddrCache: tfAddr, } l = append(l, item) } else { // Multi-resource mode only honors the resourceName[Pre|Suf]fix for i, res := range rl { tfAddr := tfaddr.TFAddr{ Type: "", Name: fmt.Sprintf("%s%d%s", meta.resourceNamePrefix, i, meta.resourceNameSuffix), } item := ImportItem{ AzureResourceID: res.AzureId, TFResourceId: res.TFId, TFAddr: tfAddr, TFAddrCache: tfAddr, } if res.TFType != "" { item.TFAddr.Type = res.TFType item.TFAddrCache.Type = res.TFType item.Recommendations = []string{res.TFType} item.IsRecommended = true } l = append(l, item) } } l = meta.excludeImportList(l) return l, nil }