Skip to content

Commit 2198acc

Browse files
Snapshot (#49)
1 parent f8a879d commit 2198acc

6 files changed

Lines changed: 583 additions & 21 deletions

File tree

azureappconfiguration/azureappconfiguration.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,11 @@ func (azappcfg *AzureAppConfiguration) loadFeatureFlags(ctx context.Context, set
480480

481481
dedupFeatureFlags := make(map[string]any, len(settingsResponse.settings))
482482
for _, setting := range settingsResponse.settings {
483+
// Skip non-feature flag settings
484+
if setting.ContentType == nil || *setting.ContentType != featureFlagContentType {
485+
continue
486+
}
487+
483488
if setting.Key != nil {
484489
var v map[string]any
485490
if err := json.Unmarshal([]byte(*setting.Value), &v); err != nil {
@@ -725,7 +730,9 @@ func deduplicateSelectors(selectors []Selector) []Selector {
725730

726731
func getFeatureFlagSelectors(selectors []Selector) []Selector {
727732
for i := range selectors {
728-
selectors[i].KeyFilter = featureFlagKeyPrefix + selectors[i].KeyFilter
733+
if selectors[i].SnapshotName == "" {
734+
selectors[i].KeyFilter = featureFlagKeyPrefix + selectors[i].KeyFilter
735+
}
729736
}
730737

731738
return selectors

azureappconfiguration/options.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ type Selector struct {
7070
// Empty string or omitted value will use the default no-label filter.
7171
// Note: Wildcards are not supported in label filters.
7272
LabelFilter string
73+
74+
// Snapshot is a set of key-values selected from the App Configuration store based on the composition type and filters.
75+
// Once created, it is stored as an immutable entity that can be referenced by name.
76+
// SnapshotName specifies the name of the snapshot to retrieve.
77+
// If SnapshotName is used in a selector, no key and label filter should be used for it. Otherwise, an error will be returned.
78+
SnapshotName string
7379
}
7480

7581
// KeyValueRefreshOptions contains optional parameters to configure the behavior of key-value settings refresh

azureappconfiguration/settings_client.go

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package azureappconfiguration
66
import (
77
"context"
88
"errors"
9+
"fmt"
910
"log"
1011

1112
"github.com/Azure/AppConfiguration-GoProvider/azureappconfiguration/internal/tracing"
@@ -62,25 +63,46 @@ func (s *selectorSettingsClient) getSettings(ctx context.Context) (*settingsResp
6263
settings := make([]azappconfig.Setting, 0)
6364
pageETags := make(map[Selector][]*azcore.ETag)
6465
for _, filter := range s.selectors {
65-
selector := azappconfig.SettingSelector{
66-
KeyFilter: to.Ptr(filter.KeyFilter),
67-
LabelFilter: to.Ptr(filter.LabelFilter),
68-
Fields: azappconfig.AllSettingFields(),
69-
}
66+
if filter.SnapshotName == "" {
67+
selector := azappconfig.SettingSelector{
68+
KeyFilter: to.Ptr(filter.KeyFilter),
69+
LabelFilter: to.Ptr(filter.LabelFilter),
70+
Fields: azappconfig.AllSettingFields(),
71+
}
7072

71-
pager := s.client.NewListSettingsPager(selector, nil)
72-
eTags := make([]*azcore.ETag, 0)
73-
for pager.More() {
74-
page, err := pager.NextPage(ctx)
73+
pager := s.client.NewListSettingsPager(selector, nil)
74+
eTags := make([]*azcore.ETag, 0)
75+
for pager.More() {
76+
page, err := pager.NextPage(ctx)
77+
if err != nil {
78+
return nil, err
79+
} else if page.Settings != nil {
80+
settings = append(settings, page.Settings...)
81+
eTags = append(eTags, page.ETag)
82+
}
83+
}
84+
85+
pageETags[filter] = eTags
86+
} else {
87+
snapshot, err := s.client.GetSnapshot(ctx, filter.SnapshotName, nil)
7588
if err != nil {
7689
return nil, err
77-
} else if page.Settings != nil {
78-
settings = append(settings, page.Settings...)
79-
eTags = append(eTags, page.ETag)
8090
}
81-
}
8291

83-
pageETags[filter] = eTags
92+
if snapshot.CompositionType == nil || *snapshot.CompositionType != azappconfig.CompositionTypeKey {
93+
return nil, fmt.Errorf("composition type for the selected snapshot '%s' must be 'key'", filter.SnapshotName)
94+
}
95+
96+
pager := s.client.NewListSettingsForSnapshotPager(filter.SnapshotName, nil)
97+
for pager.More() {
98+
page, err := pager.NextPage(ctx)
99+
if err != nil {
100+
return nil, err
101+
} else if page.Settings != nil {
102+
settings = append(settings, page.Settings...)
103+
}
104+
}
105+
}
84106
}
85107

86108
return &settingsResponse{

0 commit comments

Comments
 (0)