-
Notifications
You must be signed in to change notification settings - Fork 198
/
Copy pathmeta_rg.go
132 lines (116 loc) · 3.75 KB
/
meta_rg.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
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/azlist/azlist"
)
type MetaResourceGroup struct {
baseMeta
resourceGroup string
resourceNamePrefix string
resourceNameSuffix string
includeRoleAssignment bool
}
func NewMetaResourceGroup(cfg config.Config) (*MetaResourceGroup, error) {
cfg.Logger.Info("New resource group meta")
baseMeta, err := NewBaseMeta(cfg.CommonConfig)
if err != nil {
return nil, err
}
meta := &MetaResourceGroup{
baseMeta: *baseMeta,
resourceGroup: cfg.ResourceGroupName,
includeRoleAssignment: cfg.IncludeRoleAssignment,
}
meta.resourceNamePrefix, meta.resourceNameSuffix = resourceNamePattern(cfg.ResourceNamePattern)
return meta, nil
}
func (meta MetaResourceGroup) ScopeName() string {
return meta.resourceGroup
}
func (meta *MetaResourceGroup) ListResource(ctx context.Context) (ImportList, error) {
meta.Logger().Debug("Query resource set")
rset, err := meta.queryResourceSet(ctx, meta.resourceGroup)
if err != nil {
return nil, err
}
var rl []resourceset.TFResource
if meta.useAzAPI() {
rl = rset.ToTFAzAPIResources()
} else {
meta.Logger().Debug("Populate resource set")
if err := rset.PopulateResource(); err != nil {
return nil, fmt.Errorf("tweaking single resources in the azure resource set: %v", err)
}
meta.Logger().Debug("Reduce resource set")
if err := rset.ReduceResource(); err != nil {
return nil, fmt.Errorf("tweaking across resources in the azure resource set: %v", err)
}
meta.Logger().Debug("Azure Resource set map to TF resource set")
rl = rset.ToTFAzureRMResources(meta.Logger(), meta.parallelism, meta.azureSDKCred, meta.azureSDKClientOpt)
}
var l ImportList
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.Recommendations = []string{res.TFType}
item.TFAddr.Type = res.TFType
item.TFAddrCache.Type = res.TFType
item.IsRecommended = true
}
l = append(l, item)
}
return l, nil
}
func (meta MetaResourceGroup) queryResourceSet(ctx context.Context, rg string) (*resourceset.AzureResourceSet, error) {
opt := azlist.Option{
Logger: meta.logger.WithGroup("azlist"),
SubscriptionId: meta.subscriptionId,
Cred: meta.azureSDKCred,
ClientOpt: meta.azureSDKClientOpt,
Parallelism: meta.parallelism,
Recursive: true,
IncludeResourceGroup: true,
ExtensionResourceTypes: extBuilder{includeRoleAssignment: meta.includeRoleAssignment}.Build(),
}
lister, err := azlist.NewLister(opt)
if err != nil {
return nil, fmt.Errorf("building azlister: %v", err)
}
result, err := lister.List(ctx, fmt.Sprintf("resourceGroup =~ %q", rg))
if err != nil {
return nil, fmt.Errorf("listing resource set: %w", err)
}
var rl []resourceset.AzureResource
for _, res := range result.Resources {
res := resourceset.AzureResource{
Id: res.Id,
Properties: res.Properties,
}
rl = append(rl, res)
}
// Especially, if there is no resource within the resource group, the azlist will return an empty list.
// In this case, we'll have to add the resource group manually.
if len(rl) == 0 {
rl = append(rl,
resourceset.AzureResource{Id: &armid.ResourceGroup{
SubscriptionId: meta.subscriptionId,
Name: meta.resourceGroup,
}},
)
}
return &resourceset.AzureResourceSet{Resources: rl}, nil
}