Skip to content

Commit

Permalink
Improve validation to catch use of armID as name (#3621)
Browse files Browse the repository at this point in the history
* Improve validation to catch use of armID as name

* Add test

* Update v2/internal/resolver/resolver_test.go

Co-authored-by: Bevan Arps <bevan.arps@microsoft.com>

* Fix assertions

---------

Co-authored-by: Bevan Arps <bevan.arps@microsoft.com>
  • Loading branch information
super-harsh and theunrepentantgeek authored Dec 5, 2023
1 parent 122dd82 commit b75f812
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
6 changes: 6 additions & 0 deletions v2/internal/resolver/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ package resolver
import (
"context"

"github.com/Azure/azure-sdk-for-go/sdk/azcore/arm"
"github.com/pkg/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/runtime"
Expand Down Expand Up @@ -168,6 +169,11 @@ func (r *Resolver) ResolveReference(ctx context.Context, ref genruntime.Namespac
refObj, err := r.client.GetObject(ctx, refNamespacedName, refGVK)
if err != nil {
if apierrors.IsNotFound(err) {
// Check if the user has mistakenly put the armID in 'name' field
_, err1 := arm.ParseResourceID(ref.Name)
if err1 == nil {
return nil, errors.Errorf("couldn't resolve reference %s. 'name' looks like it might be an ARM ID; did you mean 'armID: %s'?", refNamespacedName.String(), ref.Name)
}
err := core.NewReferenceNotFoundError(refNamespacedName, err)
return nil, errors.WithStack(err)
}
Expand Down
20 changes: 20 additions & 0 deletions v2/internal/resolver/resolver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,26 @@ func Test_ResolveReference_ReturnsErrorIfReferenceIsNotAKubernetesReference(t *t
g.Expect(err).To(MatchError("reference abcd is not pointing to a Kubernetes resource"))
}

func Test_ResolveReference_ReturnsErrorIfReferenceContainsArmIdAsName(t *testing.T) {
t.Parallel()
g := NewGomegaWithT(t)
ctx := context.TODO()

test, err := testSetup()
g.Expect(err).ToNot(HaveOccurred())

armID := "/subscriptions/00000000-0000-0000-000000000000/resources/resourceGroups/myrg"

ref := genruntime.ResourceReference{Group: resolver.ResourceGroupGroup, Kind: resolver.ResourceGroupKind, Name: armID}
_, err = test.resolver.ResolveReference(ctx, ref.AsNamespacedRef(testNamespace))

g.Expect(err).To(HaveOccurred())
g.Expect(err.Error()).To(ContainSubstring("couldn't resolve reference"))
g.Expect(err.Error()).To(ContainSubstring(fmt.Sprintf("%s/%s", testNamespace, armID)))
g.Expect(err.Error()).To(ContainSubstring("did you mean 'armID:"))
g.Expect(err.Error()).To(ContainSubstring(armID))
}

func Test_ResolveReferenceToARMID_KubernetesResource_ReturnsExpectedID(t *testing.T) {
t.Parallel()
g := NewGomegaWithT(t)
Expand Down

0 comments on commit b75f812

Please # to comment.