mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-21 06:02:58 -06:00
Merge pull request #4446 from TimeIncOSS/f-schema-new-resource
helper/schema: Allow identification of a new resource in update func
This commit is contained in:
commit
8bdd92187c
@ -142,6 +142,7 @@ func (r *Resource) Apply(
|
|||||||
err = nil
|
err = nil
|
||||||
if data.Id() == "" {
|
if data.Id() == "" {
|
||||||
// We're creating, it is a new resource.
|
// We're creating, it is a new resource.
|
||||||
|
data.MarkNewResource()
|
||||||
err = r.Create(data, meta)
|
err = r.Create(data, meta)
|
||||||
} else {
|
} else {
|
||||||
if r.Update == nil {
|
if r.Update == nil {
|
||||||
|
@ -30,6 +30,7 @@ type ResourceData struct {
|
|||||||
partial bool
|
partial bool
|
||||||
partialMap map[string]struct{}
|
partialMap map[string]struct{}
|
||||||
once sync.Once
|
once sync.Once
|
||||||
|
isNew bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// getResult is the internal structure that is generated when a Get
|
// getResult is the internal structure that is generated when a Get
|
||||||
@ -171,6 +172,14 @@ func (d *ResourceData) SetPartial(k string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *ResourceData) MarkNewResource() {
|
||||||
|
d.isNew = true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *ResourceData) IsNewResource() bool {
|
||||||
|
return d.isNew
|
||||||
|
}
|
||||||
|
|
||||||
// Id returns the ID of the resource.
|
// Id returns the ID of the resource.
|
||||||
func (d *ResourceData) Id() string {
|
func (d *ResourceData) Id() string {
|
||||||
var result string
|
var result string
|
||||||
|
@ -312,6 +312,87 @@ func TestResourceApply_updateNoCallback(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestResourceApply_isNewResource(t *testing.T) {
|
||||||
|
r := &Resource{
|
||||||
|
Schema: map[string]*Schema{
|
||||||
|
"foo": &Schema{
|
||||||
|
Type: TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
updateFunc := func(d *ResourceData, m interface{}) error {
|
||||||
|
d.Set("foo", "updated")
|
||||||
|
if d.IsNewResource() {
|
||||||
|
d.Set("foo", "new-resource")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
r.Create = func(d *ResourceData, m interface{}) error {
|
||||||
|
d.SetId("foo")
|
||||||
|
d.Set("foo", "created")
|
||||||
|
return updateFunc(d, m)
|
||||||
|
}
|
||||||
|
r.Update = updateFunc
|
||||||
|
|
||||||
|
d := &terraform.InstanceDiff{
|
||||||
|
Attributes: map[string]*terraform.ResourceAttrDiff{
|
||||||
|
"foo": &terraform.ResourceAttrDiff{
|
||||||
|
New: "bla-blah",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// positive test
|
||||||
|
var s *terraform.InstanceState = nil
|
||||||
|
|
||||||
|
actual, err := r.Apply(s, d, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected := &terraform.InstanceState{
|
||||||
|
ID: "foo",
|
||||||
|
Attributes: map[string]string{
|
||||||
|
"id": "foo",
|
||||||
|
"foo": "new-resource",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(actual, expected) {
|
||||||
|
t.Fatalf("actual: %#v\nexpected: %#v",
|
||||||
|
actual, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
// negative test
|
||||||
|
s = &terraform.InstanceState{
|
||||||
|
ID: "foo",
|
||||||
|
Attributes: map[string]string{
|
||||||
|
"id": "foo",
|
||||||
|
"foo": "new-resource",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
actual, err = r.Apply(s, d, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
expected = &terraform.InstanceState{
|
||||||
|
ID: "foo",
|
||||||
|
Attributes: map[string]string{
|
||||||
|
"id": "foo",
|
||||||
|
"foo": "updated",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(actual, expected) {
|
||||||
|
t.Fatalf("actual: %#v\nexpected: %#v",
|
||||||
|
actual, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestResourceInternalValidate(t *testing.T) {
|
func TestResourceInternalValidate(t *testing.T) {
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
In *Resource
|
In *Resource
|
||||||
|
Loading…
Reference in New Issue
Block a user