-
Notifications
You must be signed in to change notification settings - Fork 2
/
client.resources.go
100 lines (80 loc) · 2.91 KB
/
client.resources.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
package armclient
import (
"context"
"fmt"
"strings"
"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
"go.uber.org/zap"
"github.com/webdevops/go-common/utils/to"
)
const (
CacheIdentifierResourcesList = "resources:%s"
CacheIdentifierResourcesID = "resourceID:%s"
)
// GetCachedResource return cached Azure Resource by resourceID
func (azureClient *ArmClient) GetCachedResource(ctx context.Context, resourceID string) (*armresources.GenericResourceExpanded, error) {
cacheKey := fmt.Sprintf(CacheIdentifierResourcesID, strings.ToLower(resourceID))
result, err := azureClient.cacheData(cacheKey, func() (interface{}, error) {
var resource *armresources.GenericResourceExpanded
resourceInfo, err := ParseResourceId(resourceID)
if err != nil {
return nil, err
}
list, err := azureClient.ListCachedResources(ctx, resourceInfo.Subscription)
if err != nil {
return list, err
}
if val, exists := list[resourceID]; exists {
return val, nil
}
// not found
return resource, nil
})
if err != nil {
return nil, err
}
return result.(*armresources.GenericResourceExpanded), nil
}
// ListCachedResources return cached list of Azure Resources as map (key is ResourceID)
func (azureClient *ArmClient) ListCachedResources(ctx context.Context, subscriptionID string) (map[string]*armresources.GenericResourceExpanded, error) {
result, err := azureClient.cacheData(fmt.Sprintf(CacheIdentifierResourcesList, subscriptionID), func() (interface{}, error) {
azureClient.logger.With(zap.String(`subscriptionID`, subscriptionID)).Debug("updating cached Azure Resource list")
list, err := azureClient.ListResources(ctx, subscriptionID)
if err != nil {
return list, err
}
azureClient.logger.With(zap.String(`subscriptionID`, subscriptionID)).Debugf("found %v Azure Resources", len(list))
return list, nil
})
if err != nil {
return nil, err
}
return result.(map[string]*armresources.GenericResourceExpanded), nil
}
// ListResources return list of Azure Resources as map (key is ResourceID)
func (azureClient *ArmClient) ListResources(ctx context.Context, subscriptionID string) (map[string]*armresources.GenericResourceExpanded, error) {
list := map[string]*armresources.GenericResourceExpanded{}
client, err := armresources.NewClient(subscriptionID, azureClient.GetCred(), azureClient.NewArmClientOptions())
if err != nil {
return nil, err
}
pager := client.NewListPager(nil)
for pager.More() {
result, err := pager.NextPage(ctx)
if err != nil {
return nil, err
}
if result.Value == nil {
continue
}
for _, resource := range result.Value {
list[to.StringLower(resource.ID)] = resource
}
}
// update cache
azureClient.cache.SetDefault(fmt.Sprintf(CacheIdentifierResourcesList, subscriptionID), list)
for resourceID, resource := range list {
azureClient.cache.SetDefault(fmt.Sprintf(CacheIdentifierResourcesID, resourceID), resource)
}
return list, nil
}