Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 1 addition & 9 deletions cmd/angryjet/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,6 @@ const (
ClientAlias = "client"
ClientImport = "sigs.k8s.io/controller-runtime/pkg/client"

ConvertAlias = "convert"
ConvertImport = "github.com/crossplane/crossplane-tools/pkg/convert"

RuntimeAlias = "xpv1"
RuntimeImport = "github.com/crossplane/crossplane-runtime/apis/common/v1"

Expand All @@ -61,9 +58,6 @@ const (

ReferenceAlias = "reference"
ReferenceImport = "github.com/crossplane/crossplane-runtime/pkg/reference"

PtrAlias = "ptr"
PtrImport = "k8s.io/utils/ptr"
)

func main() {
Expand Down Expand Up @@ -234,16 +228,14 @@ func GenerateReferences(filename, header string, p *packages.Package) error {
comm := comments.In(p)

methods := method.Set{
"ResolveReferences": method.NewResolveReferences(types.NewTraverser(comm), receiver, ClientImport, ReferenceImport, ConvertImport, PtrImport),
"ResolveReferences": method.NewResolveReferences(types.NewTraverser(comm), receiver, ClientImport, ReferenceImport),
}

err := generate.WriteMethods(p, methods, filepath.Join(filepath.Dir(p.GoFiles[0]), filename),
generate.WithHeaders(header),
generate.WithImportAliases(map[string]string{
ClientImport: ClientAlias,
ConvertImport: ConvertAlias,
ReferenceImport: ReferenceAlias,
PtrAlias: PtrImport,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting. Shouldn't this have been PtrImport: PtrAlias (key & value reversed) in the first place? Looks like the function expects a map where keys are imports, not aliases?

}),
generate.WithMatcher(match.AllOf(
match.Managed(),
Expand Down
22 changes: 11 additions & 11 deletions internal/method/resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import (

// NewResolveReferences returns a NewMethod that writes a ResolveReferences for
// given managed resource, if needed.
func NewResolveReferences(traverser *xptypes.Traverser, receiver, clientPath, referencePkgPath string, convertPkgPath string, ptrPkgPath string) New {
func NewResolveReferences(traverser *xptypes.Traverser, receiver, clientPath, referencePkgPath string) New {
return func(f *jen.File, o types.Object) {
n, ok := o.Type().(*types.Named)
if !ok {
Expand All @@ -55,10 +55,10 @@ func NewResolveReferences(traverser *xptypes.Traverser, receiver, clientPath, re
for i, ref := range refs {
if ref.IsSlice {
hasMultiResolution = true
resolverCalls[i] = encapsulate(0, multiResolutionCall(ref, referencePkgPath, convertPkgPath), ref.GoValueFieldPath...).Line()
resolverCalls[i] = encapsulate(0, multiResolutionCall(ref, referencePkgPath), ref.GoValueFieldPath...).Line()
} else {
hasSingleResolution = true
resolverCalls[i] = encapsulate(0, singleResolutionCall(ref, referencePkgPath, ptrPkgPath), ref.GoValueFieldPath...).Line()
resolverCalls[i] = encapsulate(0, singleResolutionCall(ref, referencePkgPath), ref.GoValueFieldPath...).Line()
}
}
var initStatements jen.Statement
Expand Down Expand Up @@ -113,7 +113,7 @@ func encapsulate(index int, callFn resolutionCallFn, fields ...string) *jen.Stat
}
}

func singleResolutionCall(ref Reference, referencePkgPath string, ptrPkgPath string) resolutionCallFn {
func singleResolutionCall(ref Reference, referencePkgPath string) resolutionCallFn {
return func(fields ...string) *jen.Statement {
prefixPath := jen.Id(fields[0])
for i := 1; i < len(fields)-1; i++ {
Expand All @@ -124,15 +124,15 @@ func singleResolutionCall(ref Reference, referencePkgPath string, ptrPkgPath str
selectorFieldPath := prefixPath.Clone().Dot(ref.GoSelectorFieldName)

setResolvedValue := currentValuePath.Clone().Op("=").Id("rsp").Dot("ResolvedValue")
toPointerFunction := "To"
fromPointerFunction := "Deref"
toPointerFunction := "ToPtrValue"
fromPointerFunction := "FromPtrValue"
if ref.IsFloatPointer {
toPointerFunction = "ToFloatPtrValue"
fromPointerFunction = "FromFloatPtrValue"
}
if ref.IsPointer {
setResolvedValue = currentValuePath.Clone().Op("=").Qual(ptrPkgPath, toPointerFunction).Call(jen.Id("rsp").Dot("ResolvedValue"))
currentValuePath = jen.Qual(ptrPkgPath, fromPointerFunction).Call(currentValuePath, jen.Op(`""`))
setResolvedValue = currentValuePath.Clone().Op("=").Qual(referencePkgPath, toPointerFunction).Call(jen.Id("rsp").Dot("ResolvedValue"))
currentValuePath = jen.Qual(referencePkgPath, fromPointerFunction).Call(currentValuePath)
Comment thread
ulucinar marked this conversation as resolved.
}
return &jen.Statement{
jen.List(jen.Id("rsp"), jen.Err()).Op("=").Id("r").Dot("Resolve").Call(
Expand Down Expand Up @@ -162,7 +162,7 @@ func singleResolutionCall(ref Reference, referencePkgPath string, ptrPkgPath str
}
}

func multiResolutionCall(ref Reference, referencePkgPath string, convertPkgPath string) resolutionCallFn {
func multiResolutionCall(ref Reference, referencePkgPath string) resolutionCallFn {
return func(fields ...string) *jen.Statement {
prefixPath := jen.Id(fields[0])
for i := 1; i < len(fields)-1; i++ {
Expand All @@ -181,8 +181,8 @@ func multiResolutionCall(ref Reference, referencePkgPath string, convertPkgPath
}

if ref.IsPointer {
setResolvedValues = currentValuePath.Clone().Op("=").Qual(convertPkgPath, toPointersFunction).Call(jen.Id("mrsp").Dot("ResolvedValues"))
currentValuePath = jen.Qual(convertPkgPath, fromPointersFunction).Call(currentValuePath)
setResolvedValues = currentValuePath.Clone().Op("=").Qual(referencePkgPath, toPointersFunction).Call(jen.Id("mrsp").Dot("ResolvedValues"))
currentValuePath = jen.Qual(referencePkgPath, fromPointersFunction).Call(currentValuePath)
}

return &jen.Statement{
Expand Down
52 changes: 35 additions & 17 deletions internal/method/resolver_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ type ModelParameters struct {
// +crossplane:generate:reference:type=golang.org/fake/v1alpha1.Configuration
// +crossplane:generate:reference:extractor=golang.org/fake/v1alpha1.Configuration()
CustomConfiguration *Configuration

// +crossplane:generate:reference:type=github.com/crossplane/provider-aws/apis/identity/v1beta1.IAM
// +crossplane:generate:reference:extractor=Count()
Count *float64
}

type NetworkSpec struct {
Expand Down Expand Up @@ -105,12 +109,10 @@ type Model struct {
import (
"context"
client "example.org/client"
convert "example.org/convert"
reference "example.org/reference"
v1beta11 "github.com/crossplane/provider-aws/apis/ec2/v1beta1"
v1beta1 "github.com/crossplane/provider-aws/apis/identity/v1beta1"
errors "github.com/pkg/errors"
ptr "k8s.io/utils/ptr"
)

// ResolveReferences of this Model.
Expand Down Expand Up @@ -138,7 +140,7 @@ func (mg *Model) ResolveReferences(ctx context.Context, c client.Reader) error {
mg.Spec.ForProvider.APIIDRef = rsp.ResolvedReference

rsp, err = r.Resolve(ctx, reference.ResolutionRequest{
CurrentValue: ptr.Deref(mg.Spec.ForProvider.SecurityGroupID, ""),
CurrentValue: reference.FromPtrValue(mg.Spec.ForProvider.SecurityGroupID),
Extract: reference.ExternalName(),
Reference: mg.Spec.ForProvider.SecurityGroupIDRef,
Selector: mg.Spec.ForProvider.SecurityGroupIDSelector,
Expand All @@ -150,11 +152,11 @@ func (mg *Model) ResolveReferences(ctx context.Context, c client.Reader) error {
if err != nil {
return errors.Wrap(err, "mg.Spec.ForProvider.SecurityGroupID")
}
mg.Spec.ForProvider.SecurityGroupID = ptr.To(rsp.ResolvedValue)
mg.Spec.ForProvider.SecurityGroupID = reference.ToPtrValue(rsp.ResolvedValue)
mg.Spec.ForProvider.SecurityGroupIDRef = rsp.ResolvedReference

rsp, err = r.Resolve(ctx, reference.ResolutionRequest{
CurrentValue: ptr.Deref(mg.Spec.ForProvider.IAMRoleARN, ""),
CurrentValue: reference.FromPtrValue(mg.Spec.ForProvider.IAMRoleARN),
Extract: v1beta1.IAMRoleARN(),
Reference: mg.Spec.ForProvider.IAMRoleARNRef,
Selector: mg.Spec.ForProvider.IAMRoleARNSelector,
Expand All @@ -166,11 +168,11 @@ func (mg *Model) ResolveReferences(ctx context.Context, c client.Reader) error {
if err != nil {
return errors.Wrap(err, "mg.Spec.ForProvider.IAMRoleARN")
}
mg.Spec.ForProvider.IAMRoleARN = ptr.To(rsp.ResolvedValue)
mg.Spec.ForProvider.IAMRoleARN = reference.ToPtrValue(rsp.ResolvedValue)
mg.Spec.ForProvider.IAMRoleARNRef = rsp.ResolvedReference

rsp, err = r.Resolve(ctx, reference.ResolutionRequest{
CurrentValue: ptr.Deref(mg.Spec.ForProvider.NestedTargetWithPath, ""),
CurrentValue: reference.FromPtrValue(mg.Spec.ForProvider.NestedTargetWithPath),
Extract: v1beta1.IAMRoleARN("a.b.c"),
Reference: mg.Spec.ForProvider.NestedTargetWithPathRef,
Selector: mg.Spec.ForProvider.NestedTargetWithPathSelector,
Expand All @@ -182,11 +184,11 @@ func (mg *Model) ResolveReferences(ctx context.Context, c client.Reader) error {
if err != nil {
return errors.Wrap(err, "mg.Spec.ForProvider.NestedTargetWithPath")
}
mg.Spec.ForProvider.NestedTargetWithPath = ptr.To(rsp.ResolvedValue)
mg.Spec.ForProvider.NestedTargetWithPath = reference.ToPtrValue(rsp.ResolvedValue)
mg.Spec.ForProvider.NestedTargetWithPathRef = rsp.ResolvedReference

rsp, err = r.Resolve(ctx, reference.ResolutionRequest{
CurrentValue: ptr.Deref(mg.Spec.ForProvider.NestedTargetNoPath, ""),
CurrentValue: reference.FromPtrValue(mg.Spec.ForProvider.NestedTargetNoPath),
Extract: IAMRoleARN("a.b.c"),
Reference: mg.Spec.ForProvider.NestedTargetNoPathRef,
Selector: mg.Spec.ForProvider.NestedTargetNoPathSelector,
Expand All @@ -198,11 +200,11 @@ func (mg *Model) ResolveReferences(ctx context.Context, c client.Reader) error {
if err != nil {
return errors.Wrap(err, "mg.Spec.ForProvider.NestedTargetNoPath")
}
mg.Spec.ForProvider.NestedTargetNoPath = ptr.To(rsp.ResolvedValue)
mg.Spec.ForProvider.NestedTargetNoPath = reference.ToPtrValue(rsp.ResolvedValue)
mg.Spec.ForProvider.NestedTargetNoPathRef = rsp.ResolvedReference

rsp, err = r.Resolve(ctx, reference.ResolutionRequest{
CurrentValue: ptr.Deref(mg.Spec.ForProvider.NoArgNoPath, ""),
CurrentValue: reference.FromPtrValue(mg.Spec.ForProvider.NoArgNoPath),
Extract: IAMRoleARN(),
Reference: mg.Spec.ForProvider.NoArgNoPathRef,
Selector: mg.Spec.ForProvider.NoArgNoPathSelector,
Expand All @@ -214,7 +216,7 @@ func (mg *Model) ResolveReferences(ctx context.Context, c client.Reader) error {
if err != nil {
return errors.Wrap(err, "mg.Spec.ForProvider.NoArgNoPath")
}
mg.Spec.ForProvider.NoArgNoPath = ptr.To(rsp.ResolvedValue)
mg.Spec.ForProvider.NoArgNoPath = reference.ToPtrValue(rsp.ResolvedValue)
mg.Spec.ForProvider.NoArgNoPathRef = rsp.ResolvedReference

if mg.Spec.ForProvider.Network != nil {
Expand Down Expand Up @@ -270,7 +272,7 @@ func (mg *Model) ResolveReferences(ctx context.Context, c client.Reader) error {
mg.Spec.ForProvider.SubnetIDRefs = mrsp.ResolvedReferences

mrsp, err = r.ResolveMultiple(ctx, reference.MultiResolutionRequest{
CurrentValues: convert.FromPtrValues(mg.Spec.ForProvider.RouteTableIDs),
CurrentValues: reference.FromPtrValues(mg.Spec.ForProvider.RouteTableIDs),
Extract: reference.ExternalName(),
References: mg.Spec.ForProvider.RouteTableIDsRefs,
Selector: mg.Spec.ForProvider.RouteTableIDsSelector,
Expand All @@ -282,11 +284,11 @@ func (mg *Model) ResolveReferences(ctx context.Context, c client.Reader) error {
if err != nil {
return errors.Wrap(err, "mg.Spec.ForProvider.RouteTableIDs")
}
mg.Spec.ForProvider.RouteTableIDs = convert.ToPtrValues(mrsp.ResolvedValues)
mg.Spec.ForProvider.RouteTableIDs = reference.ToPtrValues(mrsp.ResolvedValues)
mg.Spec.ForProvider.RouteTableIDsRefs = mrsp.ResolvedReferences

rsp, err = r.Resolve(ctx, reference.ResolutionRequest{
CurrentValue: ptr.Deref(mg.Spec.ForProvider.CustomConfiguration, ""),
CurrentValue: reference.FromPtrValue(mg.Spec.ForProvider.CustomConfiguration),
Extract: Configuration(),
Reference: mg.Spec.ForProvider.CustomConfigurationRef,
Selector: mg.Spec.ForProvider.CustomConfigurationSelector,
Expand All @@ -298,9 +300,25 @@ func (mg *Model) ResolveReferences(ctx context.Context, c client.Reader) error {
if err != nil {
return errors.Wrap(err, "mg.Spec.ForProvider.CustomConfiguration")
}
mg.Spec.ForProvider.CustomConfiguration = ptr.To(rsp.ResolvedValue)
mg.Spec.ForProvider.CustomConfiguration = reference.ToPtrValue(rsp.ResolvedValue)
mg.Spec.ForProvider.CustomConfigurationRef = rsp.ResolvedReference

rsp, err = r.Resolve(ctx, reference.ResolutionRequest{
CurrentValue: reference.FromFloatPtrValue(mg.Spec.ForProvider.Count),
Extract: Count(),
Reference: mg.Spec.ForProvider.CountRef,
Selector: mg.Spec.ForProvider.CountSelector,
To: reference.To{
List: &v1beta1.IAMList{},
Managed: &v1beta1.IAM{},
},
})
if err != nil {
return errors.Wrap(err, "mg.Spec.ForProvider.Count")
}
mg.Spec.ForProvider.Count = reference.ToFloatPtrValue(rsp.ResolvedValue)
mg.Spec.ForProvider.CountRef = rsp.ResolvedReference

return nil
}
`
Expand All @@ -320,7 +338,7 @@ func TestNewResolveReferences(t *testing.T) {
t.Error(err)
}
f := jen.NewFilePath("golang.org/fake/v1alpha1")
NewResolveReferences(xptypes.NewTraverser(comments.In(pkgs[0])), "mg", "example.org/client", "example.org/reference", "example.org/convert", "k8s.io/utils/ptr")(f, pkgs[0].Types.Scope().Lookup("Model"))
NewResolveReferences(xptypes.NewTraverser(comments.In(pkgs[0])), "mg", "example.org/client", "example.org/reference")(f, pkgs[0].Types.Scope().Lookup("Model"))
if diff := cmp.Diff(generated, fmt.Sprintf("%#v", f)); diff != "" {
t.Errorf("NewResolveReferences(): -want, +got\n%s", diff)
}
Expand Down