2020-05-27 01:59:06 +02:00
|
|
|
package objchange
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/zclconf/go-cty/cty"
|
|
|
|
|
2021-05-17 21:33:17 +02:00
|
|
|
"github.com/hashicorp/terraform/internal/plans"
|
2020-05-27 01:59:06 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
// ActionForChange determines which plans.Action value best describes a
|
|
|
|
// change from the value given in before to the value given in after.
|
|
|
|
//
|
|
|
|
// Because it has no context aside from the values, it can only return the
|
|
|
|
// basic actions NoOp, Create, Update, and Delete. Other codepaths with
|
|
|
|
// additional information might make this decision differently, such as by
|
|
|
|
// using the Replace action instead of the Update action where that makes
|
|
|
|
// sense.
|
|
|
|
//
|
|
|
|
// If the after value is unknown then the action can't be properly decided, and
|
|
|
|
// so ActionForChange will conservatively return either Create or Update
|
|
|
|
// depending on whether the before value is null. The before value must always
|
|
|
|
// be fully known; ActionForChange will panic if it contains any unknown values.
|
|
|
|
func ActionForChange(before, after cty.Value) plans.Action {
|
|
|
|
switch {
|
|
|
|
case !after.IsKnown():
|
|
|
|
if before.IsNull() {
|
|
|
|
return plans.Create
|
|
|
|
}
|
|
|
|
return plans.Update
|
|
|
|
case after.IsNull() && before.IsNull():
|
|
|
|
return plans.NoOp
|
|
|
|
case after.IsNull() && !before.IsNull():
|
|
|
|
return plans.Delete
|
|
|
|
case before.IsNull() && !after.IsNull():
|
|
|
|
return plans.Create
|
|
|
|
case after.RawEquals(before):
|
|
|
|
return plans.NoOp
|
|
|
|
default:
|
|
|
|
return plans.Update
|
|
|
|
}
|
|
|
|
}
|