Skip to content

Commit 562854b

Browse files
committed
Improve samples tester to work for refs in the same folder
1 parent e3c1c1e commit 562854b

2 files changed

Lines changed: 141 additions & 107 deletions

File tree

v2/internal/testcommon/samples_tester.go

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ var exclusions = []*regexp.Regexp{
9797
regexp.MustCompile(`dbforpostgresql/.*_flexibleserversadministrator.yaml`),
9898
}
9999

100+
// referenceKey identifies a resource by its Kind and Name for rename tracking.
101+
type referenceKey struct {
102+
Kind string
103+
Name string
104+
}
105+
100106
type SamplesTester struct {
101107
noSpaceNamer ResourceNamer
102108
scheme *runtime.Scheme
@@ -106,6 +112,7 @@ type SamplesTester struct {
106112
rgName string
107113
azureSubscription string
108114
azureTenant string
115+
nameRenames map[referenceKey]string // maps (Kind, OldName) -> NewName for renamed resources
109116
}
110117

111118
type SampleObject struct {
@@ -143,6 +150,9 @@ func NewSamplesTester(
143150
rgName: rgName,
144151
azureSubscription: azureSubscription,
145152
azureTenant: azureTenant,
153+
nameRenames: map[referenceKey]string{
154+
{Kind: resolver.ResourceGroupKind, Name: defaultResourceGroup}: rgName,
155+
},
146156
}
147157
}
148158

@@ -165,7 +175,11 @@ func (t *SamplesTester) LoadSamples() (*SampleObject, error) {
165175
t.handleObject(sample, samples.RefsMap)
166176
} else {
167177
if t.useRandomName {
168-
sample.SetName(t.noSpaceNamer.GenerateName(""))
178+
oldName := sample.GetName()
179+
kind := sample.GetObjectKind().GroupVersionKind().Kind
180+
newName := t.noSpaceNamer.GenerateName("")
181+
t.nameRenames[referenceKey{Kind: kind, Name: oldName}] = newName
182+
sample.SetName(newName)
169183
}
170184

171185
t.handleObject(sample, samples.SamplesMap)
@@ -370,7 +384,7 @@ func (t *SamplesTester) updateFieldsForTest(obj genruntime.ARMMetaObject) error
370384
visitor := reflecthelpers.NewReflectVisitor()
371385
visitor.VisitStruct = t.visitStruct
372386

373-
err := visitor.Visit(obj, t.rgName)
387+
err := visitor.Visit(obj, nil)
374388
if err != nil {
375389
return eris.Wrapf(err, "updating fields for test")
376390
}
@@ -438,15 +452,14 @@ func (t *SamplesTester) replaceString(field reflect.Value, old string, new strin
438452
field.SetString(val)
439453
}
440454

441-
// visitResourceReference checks and sets the SubscriptionID and ResourceGroup name for ARM references to current values
442-
func (t *SamplesTester) visitResourceReference(_ *reflecthelpers.ReflectVisitor, it reflect.Value, ctx any) error {
455+
// visitResourceReference checks and sets the SubscriptionID and ResourceGroup name for ARM references to current values,
456+
// and updates Kubernetes-style resource references whose targets were renamed.
457+
func (t *SamplesTester) visitResourceReference(_ *reflecthelpers.ReflectVisitor, it reflect.Value, _ any) error {
443458
if !it.CanInterface() {
444459
// This should be impossible given how the visitor works
445460
panic("genruntime.ResourceReference field was unexpectedly nil")
446461
}
447462

448-
ownersName := ctx.(string)
449-
450463
reference := it.Interface().(genruntime.ResourceReference)
451464
if reference.ARMID != "" {
452465
armIDField := it.FieldByName("ARMID")
@@ -459,16 +472,17 @@ func (t *SamplesTester) visitResourceReference(_ *reflecthelpers.ReflectVisitor,
459472
armIDString = subRegex.ReplaceAllString(armIDString, fmt.Sprint("/", t.azureSubscription))
460473

461474
armIDField.SetString(armIDString)
462-
} else if reference.Kind == "ResourceGroup" && ownersName != "" { // If we're referring to a resourceGroup, it needs to be updated to refer to the random one
463-
// TODO: We're making the assumption that every reference of type ResourceGroup is by definition referring
464-
// TODO: to the randomly generated RG name, but it's possible at some future date we have multiple resourceGroups
465-
// TODO: floating around. If that happens we may need to update this logic to be a bit more discerning.
466-
nameField := it.FieldByName("Name")
467-
if !nameField.CanSet() {
468-
return eris.New("cannot set 'Name' field of 'genruntime.ResourceReference'")
469-
}
475+
} else if reference.Name != "" {
476+
// Check if this reference points to a resource that was renamed
477+
key := referenceKey{Kind: reference.Kind, Name: reference.Name}
478+
if newName, ok := t.nameRenames[key]; ok {
479+
nameField := it.FieldByName("Name")
480+
if !nameField.CanSet() {
481+
return eris.New("cannot set 'Name' field of 'genruntime.ResourceReference'")
482+
}
470483

471-
nameField.SetString(ownersName)
484+
nameField.SetString(newName)
485+
}
472486
}
473487

474488
return nil

v2/internal/testcommon/samples_tester_test.go

Lines changed: 112 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -28,103 +28,123 @@ type sampleResource struct {
2828

2929
var _ genruntime.ARMMetaObject = &sampleResource{}
3030

31-
func Test_SamplesTester_UpdatesSubscriptionReferences(t *testing.T) {
31+
func Test_SamplesTester_UpdatesFieldsForTest(t *testing.T) {
3232
t.Parallel()
3333

34-
g := NewGomegaWithT(t)
35-
36-
tester := &SamplesTester{
37-
azureSubscription: uuid.New().String(),
38-
}
39-
40-
sample := &sampleResource{
41-
Reference: genruntime.CreateResourceReferenceFromARMID("subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/vm"),
42-
}
43-
44-
err := tester.updateFieldsForTest(sample)
45-
g.Expect(err).ToNot(HaveOccurred())
46-
47-
g.Expect(sample.Reference.ARMID).To(ContainSubstring(tester.azureSubscription))
48-
}
49-
50-
func Test_SamplesTester_UpdatesSubscriptionOnlyReference(t *testing.T) {
51-
t.Parallel()
52-
53-
g := NewGomegaWithT(t)
54-
55-
tester := &SamplesTester{
56-
azureSubscription: uuid.New().String(),
57-
}
58-
59-
sample := &sampleResource{
60-
Reference: genruntime.CreateResourceReferenceFromARMID("subscriptions/00000000-0000-0000-0000-000000000000"),
61-
}
62-
63-
err := tester.updateFieldsForTest(sample)
64-
g.Expect(err).ToNot(HaveOccurred())
65-
66-
g.Expect(sample.Reference.ARMID).To(ContainSubstring(tester.azureSubscription))
67-
}
68-
69-
func Test_SamplesTester_UpdatesSubscriptionID(t *testing.T) {
70-
t.Parallel()
71-
72-
g := NewGomegaWithT(t)
73-
74-
tester := &SamplesTester{
75-
azureSubscription: uuid.New().String(),
76-
}
77-
78-
sample := &sampleResource{
79-
SubscriptionID: emptyGUID,
80-
}
81-
82-
err := tester.updateFieldsForTest(sample)
83-
g.Expect(err).ToNot(HaveOccurred())
84-
85-
g.Expect(sample.SubscriptionID).To(Equal(tester.azureSubscription))
86-
}
87-
88-
func Test_SamplesTester_UpdatesTenantID(t *testing.T) {
89-
t.Parallel()
90-
91-
g := NewGomegaWithT(t)
92-
93-
tester := &SamplesTester{
94-
azureTenant: uuid.New().String(),
95-
}
96-
97-
sample := &sampleResource{
98-
TenantID: emptyGUID,
99-
}
100-
101-
err := tester.updateFieldsForTest(sample)
102-
g.Expect(err).ToNot(HaveOccurred())
103-
104-
g.Expect(sample.TenantID).To(Equal(tester.azureTenant))
105-
}
106-
107-
func Test_SamplesTester_UpdatesResourceGroupName(t *testing.T) {
108-
t.Parallel()
109-
110-
g := NewGomegaWithT(t)
111-
112-
tester := &SamplesTester{
113-
rgName: "somerandomrg",
114-
}
115-
116-
sample := &sampleResource{
117-
Reference: genruntime.ResourceReference{
118-
Group: "resources.azure.com",
119-
Kind: "ResourceGroup",
120-
Name: "aso-sample-rg",
34+
subscription := uuid.New().String()
35+
tenant := uuid.New().String()
36+
rgName := "somerandomrg"
37+
38+
cases := []struct {
39+
name string
40+
useRandomName bool
41+
rgName string
42+
subscription string
43+
tenant string
44+
nameRenames map[referenceKey]string
45+
sample *sampleResource
46+
check func(g Gomega, sample *sampleResource)
47+
}{
48+
{
49+
name: "updates ARMID reference with subscription",
50+
subscription: subscription,
51+
sample: &sampleResource{
52+
Reference: genruntime.CreateResourceReferenceFromARMID("subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg/providers/Microsoft.Compute/virtualMachines/vm"),
53+
},
54+
check: func(g Gomega, sample *sampleResource) {
55+
g.Expect(sample.Reference.ARMID).To(ContainSubstring(subscription))
56+
},
57+
},
58+
{
59+
name: "updates subscription-only ARMID reference",
60+
subscription: subscription,
61+
sample: &sampleResource{
62+
Reference: genruntime.CreateResourceReferenceFromARMID("subscriptions/00000000-0000-0000-0000-000000000000"),
63+
},
64+
check: func(g Gomega, sample *sampleResource) {
65+
g.Expect(sample.Reference.ARMID).To(ContainSubstring(subscription))
66+
},
67+
},
68+
{
69+
name: "updates SubscriptionID field",
70+
subscription: subscription,
71+
sample: &sampleResource{
72+
SubscriptionID: emptyGUID,
73+
},
74+
check: func(g Gomega, sample *sampleResource) {
75+
g.Expect(sample.SubscriptionID).To(Equal(subscription))
76+
},
77+
},
78+
{
79+
name: "updates TenantID field",
80+
tenant: tenant,
81+
sample: &sampleResource{
82+
TenantID: emptyGUID,
83+
},
84+
check: func(g Gomega, sample *sampleResource) {
85+
g.Expect(sample.TenantID).To(Equal(tenant))
86+
},
87+
},
88+
{
89+
name: "updates ResourceGroup reference name",
90+
rgName: rgName,
91+
sample: &sampleResource{
92+
Reference: genruntime.ResourceReference{
93+
Group: "resources.azure.com",
94+
Kind: "ResourceGroup",
95+
Name: "aso-sample-rg",
96+
},
97+
},
98+
check: func(g Gomega, sample *sampleResource) {
99+
g.Expect(sample.Reference.Name).To(Equal(rgName))
100+
},
101+
},
102+
{
103+
name: "updates reference name when useRandomNames is true",
104+
useRandomName: true,
105+
nameRenames: map[referenceKey]string{
106+
{Kind: "VirtualNetwork", Name: "my-virtual-network"}: "randomname123",
107+
},
108+
sample: &sampleResource{
109+
Reference: genruntime.ResourceReference{
110+
Group: "network.azure.com",
111+
Kind: "VirtualNetwork",
112+
Name: "my-virtual-network",
113+
},
114+
},
115+
check: func(g Gomega, sample *sampleResource) {
116+
g.Expect(sample.Reference.Name).To(Equal("randomname123"))
117+
},
121118
},
122119
}
123120

124-
err := tester.updateFieldsForTest(sample)
125-
g.Expect(err).ToNot(HaveOccurred())
126-
127-
g.Expect(sample.Reference.Name).To(Equal(tester.rgName))
121+
for _, c := range cases {
122+
c := c
123+
t.Run(c.name, func(t *testing.T) {
124+
t.Parallel()
125+
g := NewGomegaWithT(t)
126+
127+
tester := NewSamplesTester(
128+
ResourceNamer{},
129+
nil,
130+
"",
131+
"",
132+
c.useRandomName,
133+
c.rgName,
134+
c.subscription,
135+
c.tenant,
136+
)
137+
138+
for k, v := range c.nameRenames {
139+
tester.nameRenames[k] = v
140+
}
141+
142+
err := tester.updateFieldsForTest(c.sample)
143+
g.Expect(err).ToNot(HaveOccurred())
144+
145+
c.check(g, c.sample)
146+
})
147+
}
128148
}
129149

130150
func (s *sampleResource) GetSupportedOperations() []genruntime.ResourceOperation {

0 commit comments

Comments
 (0)