From ac7c6a1953c20e7f548801e8a0409b5bd5bac4b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergen=20Yal=C3=A7=C4=B1n?= Date: Thu, 21 Dec 2023 18:17:47 +0300 Subject: [PATCH 1/2] Pass full state to GetExternalNameFn function to access field other than ID MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sergen Yalçın --- pkg/controller/external_nofork.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pkg/controller/external_nofork.go b/pkg/controller/external_nofork.go index 1ae2e28c..b77a4913 100644 --- a/pkg/controller/external_nofork.go +++ b/pkg/controller/external_nofork.go @@ -526,7 +526,7 @@ func (n *noForkExternal) Observe(ctx context.Context, mg xpresource.Managed) (ma resource.SetUpToDateCondition(mg, noDiff) } // check for an external-name change - if nameChanged, err := n.setExternalName(mg, newState); err != nil { + if nameChanged, err := n.setExternalName(mg, stateValueMap); err != nil { return managed.ExternalObservation{}, errors.Wrapf(err, "failed to set the external-name of the managed resource during observe") } else { specUpdateRequired = specUpdateRequired || nameChanged @@ -543,15 +543,14 @@ func (n *noForkExternal) Observe(ctx context.Context, mg xpresource.Managed) (ma // sets the external-name on the MR. Returns `true` // if the external-name of the MR has changed. -func (n *noForkExternal) setExternalName(mg xpresource.Managed, newState *tf.InstanceState) (bool, error) { - if newState.ID == "" { +func (n *noForkExternal) setExternalName(mg xpresource.Managed, stateValueMap map[string]interface{}) (bool, error) { + id, ok := stateValueMap["id"] + if !ok { return false, nil } - newName, err := n.config.ExternalName.GetExternalNameFn(map[string]any{ - "id": newState.ID, - }) + newName, err := n.config.ExternalName.GetExternalNameFn(stateValueMap) if err != nil { - return false, errors.Wrapf(err, "failed to get the external-name from ID: %s", newState.ID) + return false, errors.Wrapf(err, "failed to get the external-name from ID: %s", id) } oldName := meta.GetExternalName(mg) // we have to make sure the newly set external-name is recorded @@ -602,10 +601,10 @@ func (n *noForkExternal) Create(ctx context.Context, mg xpresource.Managed) (man } n.opTracker.SetTfState(newState) - if _, err := n.setExternalName(mg, newState); err != nil { + stateValueMap, err := n.fromInstanceStateToJSONMap(newState) + if _, err := n.setExternalName(mg, stateValueMap); err != nil { return managed.ExternalCreation{}, errors.Wrapf(err, "failed to set the external-name of the managed resource during create") } - stateValueMap, err := n.fromInstanceStateToJSONMap(newState) if err != nil { return managed.ExternalCreation{}, err } From f548c79f1fd061acec2c1e7d2fc94a7acdd5dc40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergen=20Yal=C3=A7=C4=B1n?= Date: Fri, 22 Dec 2023 14:14:20 +0300 Subject: [PATCH 2/2] - Check if the id is empty - Move the error check to the correct place MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Sergen Yalçın --- pkg/controller/external_nofork.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkg/controller/external_nofork.go b/pkg/controller/external_nofork.go index b77a4913..52a9413a 100644 --- a/pkg/controller/external_nofork.go +++ b/pkg/controller/external_nofork.go @@ -545,12 +545,12 @@ func (n *noForkExternal) Observe(ctx context.Context, mg xpresource.Managed) (ma // if the external-name of the MR has changed. func (n *noForkExternal) setExternalName(mg xpresource.Managed, stateValueMap map[string]interface{}) (bool, error) { id, ok := stateValueMap["id"] - if !ok { + if !ok || id.(string) == "" { return false, nil } newName, err := n.config.ExternalName.GetExternalNameFn(stateValueMap) if err != nil { - return false, errors.Wrapf(err, "failed to get the external-name from ID: %s", id) + return false, errors.Wrapf(err, "failed to compute the external-name from the state map of the resource with the ID %s", id) } oldName := meta.GetExternalName(mg) // we have to make sure the newly set external-name is recorded @@ -602,12 +602,12 @@ func (n *noForkExternal) Create(ctx context.Context, mg xpresource.Managed) (man n.opTracker.SetTfState(newState) stateValueMap, err := n.fromInstanceStateToJSONMap(newState) + if err != nil { + return managed.ExternalCreation{}, errors.Wrap(err, "failed to convert instance state to map") + } if _, err := n.setExternalName(mg, stateValueMap); err != nil { return managed.ExternalCreation{}, errors.Wrapf(err, "failed to set the external-name of the managed resource during create") } - if err != nil { - return managed.ExternalCreation{}, err - } err = mg.(resource.Terraformed).SetObservation(stateValueMap) if err != nil { return managed.ExternalCreation{}, errors.Errorf("could not set observation: %v", err)