mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
return error on resource type mismatch
A resource move is invalid if the two resource( instance)s are of different resource types. Check for this during move validation.
This commit is contained in:
parent
dc3ed6271c
commit
7162e79fdf
@ -178,6 +178,16 @@ func ValidateMoves(stmts []MoveStatement, rootCfg *configs.Config, declaredInsts
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Resource types must match.
|
||||||
|
if resourceTypesDiffer(absFrom, absTo) {
|
||||||
|
diags = diags.Append(&hcl.Diagnostic{
|
||||||
|
Severity: hcl.DiagError,
|
||||||
|
Summary: "Resource type mismatch",
|
||||||
|
Detail: fmt.Sprintf(
|
||||||
|
"This statement declares a move from %s to %s, which is a %s of a different type.", absFrom, absTo, noun,
|
||||||
|
),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -238,6 +248,32 @@ func moveableObjectExists(addr addrs.AbsMoveable, in instances.Set) bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func resourceTypesDiffer(absFrom, absTo addrs.AbsMoveable) bool {
|
||||||
|
switch absFrom.(type) {
|
||||||
|
case addrs.AbsResourceInstance, addrs.AbsResource:
|
||||||
|
// addrs.UnifyMoveEndpoints guarantees that both addresses are of the
|
||||||
|
// same kind, so at this point we can assume that absTo is an
|
||||||
|
// addrs.AbsResourceInstance or addrs.AbsResource.
|
||||||
|
return absMoveableResourceType(absFrom) != absMoveableResourceType(absTo)
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// absMoveableResourceType returns the type of the supplied
|
||||||
|
// addrs.AbsResourceInstance or addrs.AbsResource, or "" for other AbsMoveable
|
||||||
|
// types.
|
||||||
|
func absMoveableResourceType(addr addrs.AbsMoveable) string {
|
||||||
|
switch addr := addr.(type) {
|
||||||
|
case addrs.AbsResourceInstance:
|
||||||
|
return addr.Resource.Resource.Type
|
||||||
|
case addrs.AbsResource:
|
||||||
|
return addr.Resource.Type
|
||||||
|
default:
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func movableObjectDeclRange(addr addrs.AbsMoveable, cfg *configs.Config) (tfdiags.SourceRange, bool) {
|
func movableObjectDeclRange(addr addrs.AbsMoveable, cfg *configs.Config) (tfdiags.SourceRange, bool) {
|
||||||
switch addr := addr.(type) {
|
switch addr := addr.(type) {
|
||||||
case addrs.ModuleInstance:
|
case addrs.ModuleInstance:
|
||||||
|
Loading…
Reference in New Issue
Block a user