in pkg/cloud/rgraph/rnode/backendservice/node.go [41:95]
func (n *backendServiceNode) Diff(gotNode rnode.Node) (*rnode.PlanDetails, error) {
got, ok := gotNode.(*backendServiceNode)
if !ok {
return nil, fmt.Errorf("BackendServiceNode: invalid type to Diff: %T", gotNode)
}
diff, err := got.resource.Diff(n.resource)
if err != nil {
return nil, fmt.Errorf("BackendServiceNode: Diff %w", err)
}
if !diff.HasDiff() {
return &rnode.PlanDetails{
Operation: rnode.OpNothing,
Why: "No diff between got and want",
}, nil
}
var (
needsRecreate bool
details []string
)
planRecreate := func(s string, args ...any) {
details = append(details, fmt.Sprintf(s, args...))
needsRecreate = true
}
planUpdate := func(s string, args ...any) {
details = append(details, fmt.Sprintf(s, args...))
}
for _, delta := range diff.Items {
// These fields cannot be changed in place and require the
// resource to be recreated.
switch {
case delta.Path.Equal(api.Path{}.Pointer().Field("LoadBalancingScheme")),
delta.Path.Equal(api.Path{}.Pointer().Field("Network")):
planRecreate("LoadBalancingScheme change: '%v' -> '%v'", delta.A, delta.B)
default:
planUpdate("%s change: '%v' -> '%v'", delta.Path, delta.A, delta.B)
}
}
if needsRecreate {
return &rnode.PlanDetails{
Operation: rnode.OpRecreate,
Why: "BackendService needs to be recreated: " + strings.Join(details, ", "),
Diff: diff,
}, nil
}
return &rnode.PlanDetails{
Operation: rnode.OpUpdate,
Why: "BackendService needs to be updated: " + strings.Join(details, ", "),
Diff: diff,
}, nil
}