Skip to content

Commit 3da3f28

Browse files
committed
feat: add AddReference method to References
Signed-off-by: Yordis Prieto <[email protected]>
1 parent 4073347 commit 3da3f28

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

pkg/config/resource.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,26 @@ type ExternalName struct {
165165
IdentifierFields []string
166166
}
167167

168+
var ErrReferenceAlreadyExists = errors.New("reference for field already exists")
169+
168170
// References represents reference resolver configurations for the fields of a
169171
// given resource. Key should be the field path of the field to be referenced.
170172
type References map[string]Reference
171173

174+
// AddReference adds a reference configuration for the given field path.
175+
// The fieldPath is the Terraform field path of the field to be referenced.
176+
//
177+
// Example: "vpc_id" or "forwarding_rule.certificate_name" in case of nested
178+
// in another object.
179+
func (r References) AddReference(fieldPath string, ref Reference) error {
180+
if _, ok := r[fieldPath]; ok {
181+
return ErrReferenceAlreadyExists
182+
}
183+
184+
r[fieldPath] = ref
185+
return nil
186+
}
187+
172188
// Reference represents the Crossplane options used to generate
173189
// reference resolvers for fields
174190
type Reference struct {

pkg/config/resource_test.go

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ package config
66

77
import (
88
"context"
9+
"errors"
910
"fmt"
1011
"testing"
1112

12-
"github.com/crossplane/crossplane-runtime/pkg/errors"
1313
"github.com/crossplane/crossplane-runtime/pkg/fieldpath"
1414
xpresource "github.com/crossplane/crossplane-runtime/pkg/resource"
1515
"github.com/crossplane/crossplane-runtime/pkg/resource/fake"
@@ -112,3 +112,34 @@ func TestSetExternalTagsWithPaved(t *testing.T) {
112112
})
113113
}
114114
}
115+
116+
func TestReferences_AddReference(t *testing.T) {
117+
t.Run("Adding a reference", func(t *testing.T) {
118+
r := &Resource{References: References{}}
119+
err := r.References.AddReference("forwarding_rule.certificate_name", Reference{
120+
TerraformName: "digitalocean_certificate",
121+
})
122+
if err != nil {
123+
t.Fatalf("AddReference() got error: %v", err)
124+
}
125+
if len(r.References) != 1 {
126+
t.Fatalf("AddReference() got error: %v", err)
127+
}
128+
})
129+
t.Run("Adding twice a reference for a given field", func(t *testing.T) {
130+
r := &Resource{References: References{}}
131+
err := r.References.AddReference("forwarding_rule.certificate_name", Reference{
132+
TerraformName: "digitalocean_certificate",
133+
})
134+
if err != nil {
135+
t.Fatalf("AddReference() got error: %v", err)
136+
}
137+
138+
err = r.References.AddReference("forwarding_rule.certificate_name", Reference{
139+
TerraformName: "digitalocean_certificate",
140+
})
141+
if !errors.Is(err, ErrReferenceAlreadyExists) {
142+
t.Fatalf("AddReference() should have returned an error")
143+
}
144+
})
145+
}

0 commit comments

Comments
 (0)